Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
1

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

28.08.2012, 12:29. Просмотров 1732. Ответов 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*);
};

0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2012, 12:29
Ответы с готовыми решениями:

Сортировка кучей с указателями
Доброго времени суток. Есть задание реализации функции, которая сортирует массив чисел (например,...

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

Сортировка контейнера list
Как отсортировать (с помощью sort()) и вывести в текстовый документ список l ? код программы:...

Сортировка одномерного массива с указателями
void PositiveNegative(double* arr, int size) { int *tmp; int size = 10; for (int i = 0; i &lt;...

Алгоритмы сортировки (сортировка и вычисляемыми адресами, вычерпыванием, по индексам и с указателями).
Алгоритмы сортировки (сортировка и вычисляемыми адресами, вычерпыванием, по индексам и с...

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

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

Не по теме:

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

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

Не по теме:

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

0
DU
1489 / 1135 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 19:03 25
ну скорее всего все будет работать, нужно только правильно код организовать. я так и не понял проблему. вопрос топика касался кастомного оператора < для указателей. потом что-то левое пошло. где проблема - непонятно.
1
nexen
187 / 180 / 25
Регистрация: 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
0
DU
1489 / 1135 / 165
Регистрация: 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
  // в этом месте видно за счет инклудов в начале файла.
}
0
28.08.2012, 19:24
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2012, 19:24

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

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

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


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Опции темы

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