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

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

28.08.2012, 12:29. Показов 3377. Ответов 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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.08.2012, 12:49

Не по теме:

Цитата Сообщение от nexen Посмотреть сообщение
C++
1
2
3
if (num < ms.num)
     return true;
 return false;
C++
1
return num < ms.num



Добавлено через 1 минуту
Цитата Сообщение от nexen Посмотреть сообщение
Как перегрузить сравнение для указателей
у std::set 2-й параметр шаблона - компаратор
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 15:46  [ТС]
Хм, странно. Думал не сработает, раз перегрузка не сработала.. Почему так? Такое ощущение, что, хоть я и храню в контейнере указатели, они разыменовываются сами..
p.s А что насчет инкапсуляции?

Не по теме:


Возможна ли подобная конструкция каким-либо способом :

C++
1
2
3
4
5
6
7
8
class A
{
vector <A*> a;
};
class B
{
vector <B*> b;
};



Добавлено через 1 час 45 минут
И ещё вопрос. Хотелось бы иметь перегруженную функцию find для set (не способом &(MYSTRUCT)num, и не способом наследования от set) примерно так :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct COMP
{
bool operator()(const MYSTRUCT* a, const MYSTRUCT* b)
{
    return a->num < b->num;
}
bool operator()(const MYSTRUCT* a, const int& num)
{
    return a->num < num;
}
};
 
void main()
{
    set <MYSTRUCT*, COMP> mySet;
    MYSTRUCT a(1), b(5), c(3);
    mySet.insert(&a);
    mySet.insert(&b);
    mySet.insert(&c);
    set<MYSTRUCT*, COMP>::iterator i = mySet.find(&b);
    set<MYSTRUCT*, COMP>::iterator j = mySet.find(5); // error
}
Как такое сделать?
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
28.08.2012, 15:54
Цитата Сообщение от nexen Посмотреть сообщение
Возможна ли подобная конструкция каким-либо способом
А в чём проблема?
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.08.2012, 15:56
Цитата Сообщение от nexen Посмотреть сообщение
Как такое сделать?
std::find_if и собственный предикат для него

Добавлено через 1 минуту
Цитата Сообщение от nexen Посмотреть сообщение
p.s Нормально ли пренебрегать инкапсуляций, если класс, имеющий контейнер объектов/указателей на объекты другого класса - приватит этот контейнер, а класс, находящийся в этом контейнере - публичный, но при этом нигде больше не используется и не имеет статический методов? Что-то типа :
можно, только тогда уж вместо
C++
1
2
3
4
5
class B
{
public :
//a lot of information without methods
};
используй
C++
1
2
3
4
struct B
{
//a lot of information without methods
};
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:05  [ТС]
grizlik78, проблема в том, что первый не видит второй, либо наоборот, ведь нельзя указать прототип класса. Хотя, даже если каким-то чудом увидит, вопрос будет в размерах. Ведь размер A зависит от B, а B от A. В таком случае, размер и A, и B - сколько угодно.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
28.08.2012, 16:13
То есть в вопросе ошибка, там ведь нет взаимозависимости. Тогда так:
C++
1
2
3
4
5
6
7
8
9
10
class B;
 
class A
{
vector <B*> a;
};
class B
{
vector <A*> b;
};
Добавлено через 6 минут
Цитата Сообщение от nexen Посмотреть сообщение
ведь нельзя указать прототип класса.
Хм. Почему нельзя? Предварительное объявление есть.

Цитата Сообщение от nexen Посмотреть сообщение
Ведь размер A зависит от B, а B от A. В таком случае, размер и A, и B - сколько угодно.
У указателей размеры одинаковы и известны. Так что никаких проблем с размерами нет, пока указатель не попытаются разыменовать.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:14  [ТС]
grizlik78, и у тебя такое прокатывает? У меня ругань на class B;. Говорит, что переобъявлен класс : o
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
28.08.2012, 16:16
Хм. нельзя ли пример, который можно попытаться скомпилировать? Вообще, предварительное объявление работает, проверено электроникой. Конкретно этот пример не проверял пока.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:17  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <vector>
class B;
class A
{
public :
vector<B*> b;
A() {}
};
 
class B
{
public :
vector <A*> a;
B() {}
};
 
int main()
{
B b;
b.a.clear();
return 0;
}
Ругается на переобъявление
Вот сама ошибка : error C2039: 'a' : is not a member of 'B'
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
28.08.2012, 16:21
Вот так компилируется:
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
#include <vector>
 
using namespace std;
 
class B;
class A
{
public :
vector<B*> b;
A() {}
};
 
class B
{
public :
vector <A*> a;
B() {}
};
 
int main()
{
B b;
b.a.clear();
return 0;
}
Добавлено через 23 секунды
Цитата Сообщение от nexen Посмотреть сообщение
Ругается на переобъявление
Компилятор какой?
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.08.2012, 16:22
nexen, http://liveworkspace.org/code/... 3bfcab4917 ошибок нет
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:23  [ТС]
Jupiter, find_if идет за O(n). Если перегрузить find - то O(logN)
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
28.08.2012, 16:24
Цитата Сообщение от nexen Посмотреть сообщение
Вот сама ошибка : error C2039: 'a' : is not a member of 'B'
Это не на переобъявление. Это переменная 'a' не создалась, видимо из-за неизвестности vector, который в пространстве std.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:26  [ТС]
grizlik78, оу. Чувствую себя теперь.. не очень >_<""

А вот про find всё же интересно.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.08.2012, 16:32
Цитата Сообщение от nexen Посмотреть сообщение
find_if идет за O(n). Если перегрузить find - то O(logN)
ну дык это для указателей которые ты хранишь, а ты хочешь искать значения! храни тогда значения вместо указателей и будет тебе O(logN)
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:37  [ТС]
Jupiter, таки все указатели отсортированы именно по значению num. Ну а раз я ищу тоже по значению num, то и должно быть logN, разве нет?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.08.2012, 17:32
Цитата Сообщение от nexen Посмотреть сообщение
таки все указатели отсортированы именно по значению num. Ну а раз я ищу тоже по значению num, то и должно быть logN, разве нет?
да все верно, но сделать перегрузку find без наследования нельзя
как вариант сделать свою функцию(глобальную) которая будет создавать MYSTRUC с нужным значением и вызывать метод find для мапы
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 18:37  [ТС]
Хочу вернуться к функторам.
Возможно ли сделать так :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class COMPARE
{
public :
    bool operator() (ROOM* a, ROOM* b)
    {
        return a->_r_ID < b->_r_ID;
    }
 
    bool operator() (USER* a, USER* b)
    {
        return a->_u_ID < b->_u_ID;
    }
}
- и использовать его и для set<USER*, COMPARE> и для set<ROOM*, COMPARE>? По идее вроде бы не должно материться, но матерится :<
error C2227: left of '->_u_ID' must point to class/struct/union/generic type
при том, что указано так :
C++
1
2
3
4
class ROOM;
class USER;
class SERVER;
class COMPARE
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 18:52
указаны декларации. чтобы обращатся к методам\мемберам класса, в точке этого обращения класс уже должен быть определен, простого объявления недостаточно. т.е. перед кодом b->... должно быть определение или инклуд с определением класса Room, User и т.п.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.08.2012, 18:52
Помогаю со студенческими работами здесь

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

Сортировка контейнера 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...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru