Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

Сортировка для контейнера с указателями - C++

28.08.2012, 12:29. Просмотров 1342. Ответов 26
Метки нет (Все метки)

Понадобилось сделать контейнер указателей, но встала проблема сортировки и типа контейнера :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <set>
using std::set;
struct MYSTRUCT
{
    int num;
    char* name;
    MYSTRUCT() : num(NULL) 
    {
        name = new char[20];
        *name = num;
        name[1] = '\0';
    }
    MYSTRUCT(int x) : num(x)
    {
        name = new char[20];
        name[1] = '\0';
        *name = num;
    }
    MYSTRUCT(const MYSTRUCT& ms) : num(ms.num)
    {
        name = new char[20];
        strcpy_s(name, 19, ms.name);
    }
 
    bool operator<(const MYSTRUCT &ms) const
    {
        if (num < ms.num)
            return true;
        return false;
    }
 
    bool operator<(const MYSTRUCT* ms) const
    {
        if (num < ms->num)
            return true;
        return false;
    }
 
    ~MYSTRUCT()
    {
        num = NULL;
        delete name;
    }
 
};
 
void main()
{
    set <MYSTRUCT*> mySet;
    MYSTRUCT a(3), b(5), c(3);
    mySet.insert(&a);
    mySet.insert(&b);
    mySet.insert(&c);
    mySet.clear();
    
    int crapForTimeWasting = 0;
}
После выполнение в mySet лежит 3 объекта.
Как перегрузить сравнение для указателей, а так же как намекнуть set, что указатели равны, и он не multiset?

Не по теме:

p.s Нормально ли пренебрегать инкапсуляций, если класс, имеющий контейнер объектов/указателей на объекты другого класса - приватит этот контейнер, а класс, находящийся в этом контейнере - публичный, но при этом нигде больше не используется и не имеет статический методов? Что-то типа :

C++
1
2
3
4
5
6
7
8
9
10
11
12
class B
{
public :
*a lot of information without Set/Get methods*
};
class A
{
private :
vector<B*> field;
public :
void AddObjectIntoField(B*);
};

Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2012, 12:29     Сортировка для контейнера с указателями
Посмотрите здесь:

Сортировка ассоциативного контейнера! - C++
В классе есть поля: название, цена и количество. Нужно записать данные в ассоциативный контейнер, и нужно один раз отсортировать и вывести...

Сортировка контейнера list - C++
Как отсортировать (с помощью sort()) и вывести в текстовый документ список l ? код программы: #include &lt;iostream.h&gt; #include &lt;vector&gt;...

Алгоритмы сортировки (сортировка и вычисляемыми адресами, вычерпыванием, по индексам и с указателями). - C++
Алгоритмы сортировки (сортировка и вычисляемыми адресами, вычерпыванием, по индексам и с указателями). Нужно как бы три программы(каждую...

итератор для контейнера - C++
Собственно, интересует такой вопрос: &quot;Как создать собственный класс-итератор для контейнера?&quot;. Контейнер построен по типу &quot;очередь&quot;....

Перегрузка операторов для контейнера - C++
Доброго времени суток. Просматривая STL, в ветке вектора наткнулся на такую интересную запись: vector&lt;int&gt; v1 = {45,85,68}; ...

Итератор для собственного контейнера - C++
понимаю, что уже создан миллион подобных тем, НО я не вьехал в них. мне необходимо реализовать собственный контейнер для использования...

Организация контейнера для структур - C++
Доброго времени суток! Решая задачу по реализации контейнера столкнулся с проблемой выделения памяти для новых элементов. Первый...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 18:53  [ТС]     Сортировка для контейнера с указателями #21
Выходит, что сделать класс для "двойной" перегрузки нельзя? Ведь один класс будет 100% определен раньше другого. А засунуть сравнение после обоих классов не поможет.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 18:55     Сортировка для контейнера с указателями #22
что такое двойная перегрузка? не путаете ли вы определение с имплементацией?
сперва определения двух классов. потом имплементация методов, в которых собственно идет обращения к мемберам. т.к. определения уже были, то это нормально скомпилируется.
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,990
28.08.2012, 18:57     Сортировка для контейнера с указателями #23
Перед реализациями функций operator() есть только предварительные объявления классов или же классы уже описаны полностью? Должны быть полностью описаны. Причём для описания самого класса COMPARE достаточно только предварительных определений, но тогда функции всё-равно определять придётся после определений классов ROOM и USER, поскольку в функциях указатели разыменовываются.

Добавлено через 1 минуту

Не по теме:

Долго, что-то, набирал я

nexen
28.08.2012, 19:01  [ТС]
  #24

Не по теме:

DU, oh my god.. А я сейчас вот уже третий час пишу то, что, как оказывается, не будет работать.. Вот теперь я и правда в печали :<
На данный момент выдало 169 ошибок >_<

DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 19:03     Сортировка для контейнера с указателями #25
ну скорее всего все будет работать, нужно только правильно код организовать. я так и не понял проблему. вопрос топика касался кастомного оператора < для указателей. потом что-то левое пошло. где проблема - непонятно.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 19:13  [ТС]     Сортировка для контейнера с указателями #26
DU, попробую объяснить (а заодно надеюсь на совет - стоит ли прямо сейчас переписывать код, ибо то, что я хочу - невозможно).
Есть 4 класса : server, user, room, compare.
У server есть два поля :
set <USER*, COMPARE>
set <ROOM*, COMPARE>
У user есть поле :
set <ROOM*, COMPARE>
У room есть поле :
set <USER*, COMPARE>

Описывал я так прототипами все 4 класса. Затем подключал хэдер room, user, server, compare (именно в такой последовательности). Вся их реализация в одноименных cpp-файлах.
С точки зрения здоровой логики мне не ясно, как room, ссылается (и использует!) на поля user, определенного после него, но объявленного до него. Ну и с остальными такие же непонятки.

А насчет find и операторов я спрашивал потому, что хотел в классах user и room хранить set<int> - где это были бы ID, а в сервере уже искать запись по ID
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2012, 19:24     Сортировка для контейнера с указателями
Еще ссылки по теме:

Выбор контейнера для хранения структуры - C++
Доброе время суток! Ребят нужна помочишь при выборе контейнера для хранения структуры, точнее трех структур! Первая, (если кому...

Определение хэш-функции для контейнера - C++
На просторах stackoverflow нашел следующую реализацию для std::аrrаy: namespace std { template&lt;typename T, size_t N&gt; struct...

Свой компаратор для контейнера set - C++
Здравствуйте! Код следующий (комменты): #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;set&gt; using namespace std; //...

Использование контейнера set для создания словаря - C++
Всем привет. Прошу помощи с программой. Само задание: Написать программу «Англо - русский и русско - английский словарь». «База данных»...

Конструкторы и деструкторы для класса с указателями на строку - C++
Добрый день! Привожу фрагмент кода ниже. Появилось пару вопросов по коду. Подскажите, плиз Что значит в new strCount(s) указатель в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 19:24     Сортировка для контейнера с указателями #27
Вот может такой код прояснит немного ситуацию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
///////////////////////////////////////////////////////////////
// Foo.h
class Bar;
class Foo
{
public:
  Bar* bar;
 
  Foo();
};
 
///////////////////////////////////////////////////////////////
//Bar.h
class Foo;
 
class Bar
{
public:
  Foo* foo;
 
  Bar();
};
 
 
///////////////////////////////////////////////////////////////
// Foo.cpp
#include "Foo.h"
#include "Bar.h"
// вот начиная с этой точки и далее классы Foo и Bar определены.
// Поэтому в имплементации можно обращаться к полям
Foo::Foo()
{
  bar = new Bar();
  // это можно. ведь определение класса Bar уже видно за счет нужного инклуда. то, что конструктор Bar заимплеменчен
  // где-то в другом месте - это уже задача линковщика найти это место и в конечный
  // бинарь вставить правильный код.
 
  const bool isNull = bar->foo == 0;
  // Обращение к мемберу bar->foo тоже корректное т.к. определение класса Bar
  // в этом месте видно за счет инклудов в начале файла.
}
 
///////////////////////////////////////////////////////////////
// Bar.cpp
#include "Foo.h"
#include "Bar.h"
// вот начиная с этой точки и далее классы Foo и Bar определены.
// Поэтому в имплементации можно обращаться к полям
Bar::Bar()
{
  foo = new Foo();
  // это можно. ведь определение класса Foo уже видно за счет нужного инклуда. то, что конструктор Foo заимплеменчен
  // где-то в другом месте - это уже задача линковщика найти это место и в конечный
  // бинарь вставить правильный код.
 
  const bool isNull = foo->bar == 0;
  // Обращение к мемберу foo->bar тоже корректное т.к. определение класса Foo
  // в этом месте видно за счет инклудов в начале файла.
}
Yandex
Объявления
28.08.2012, 19:24     Сортировка для контейнера с указателями
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru