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

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

28.08.2012, 12:29. Показов 3771. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.08.2012, 12:29
Ответы с готовыми решениями:

Сортировка Шелла для контейнера List библиотеки STL
Сама сортировка Шелла понятна, а как ее можно использовать для сортировки элементов контейнера List библиотеки STL? Интересует момент с...

Сортировка с указателями
В пузырьковой сортировке надо написать функцию, которая будет принимать два указателя, один на начало массива, второй на конец...

Быстрая сортировка с указателями
Здрауствуйте, подскажите пожадуйста, я сделал быструю сортировку с указателями, оно вроде работет - сортирует, но 1 елемент куда-то...

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

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

Не по теме:

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

1
28.08.2012, 19:01  [ТС]

Не по теме:

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

0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 19:03
ну скорее всего все будет работать, нужно только правильно код организовать. я так и не понял проблему. вопрос топика касался кастомного оператора < для указателей. потом что-то левое пошло. где проблема - непонятно.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 19:13  [ТС]
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
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 19:24
Вот может такой код прояснит немного ситуацию:
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.08.2012, 19:24

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

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

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

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

Сортировка элементов массива Указателями
Выдаёт ошибку.Помогите пожалуйста исправить. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void sorter(int *, const int); int...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru