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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 12:29     Сортировка для контейнера с указателями #1
Понадобилось сделать контейнер указателей, но встала проблема сортировки и типа контейнера :
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*);
};

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.08.2012, 12:49     Сортировка для контейнера с указателями #2

Не по теме:

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



Добавлено через 1 минуту
Цитата Сообщение от nexen Посмотреть сообщение
Как перегрузить сравнение для указателей
у std::set 2-й параметр шаблона - компаратор
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 15:46  [ТС]     Сортировка для контейнера с указателями #3
Хм, странно. Думал не сработает, раз перегрузка не сработала.. Почему так? Такое ощущение, что, хоть я и храню в контейнере указатели, они разыменовываются сами..
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
}
Как такое сделать?
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
28.08.2012, 15:54     Сортировка для контейнера с указателями #4
Цитата Сообщение от nexen Посмотреть сообщение
Возможна ли подобная конструкция каким-либо способом
А в чём проблема?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.08.2012, 15:56     Сортировка для контейнера с указателями #5
Цитата Сообщение от 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
};
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:05  [ТС]     Сортировка для контейнера с указателями #6
grizlik78, проблема в том, что первый не видит второй, либо наоборот, ведь нельзя указать прототип класса. Хотя, даже если каким-то чудом увидит, вопрос будет в размерах. Ведь размер A зависит от B, а B от A. В таком случае, размер и A, и B - сколько угодно.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
28.08.2012, 16:13     Сортировка для контейнера с указателями #7
То есть в вопросе ошибка, там ведь нет взаимозависимости. Тогда так:
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 - сколько угодно.
У указателей размеры одинаковы и известны. Так что никаких проблем с размерами нет, пока указатель не попытаются разыменовать.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:14  [ТС]     Сортировка для контейнера с указателями #8
grizlik78, и у тебя такое прокатывает? У меня ругань на class B;. Говорит, что переобъявлен класс : o
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
28.08.2012, 16:16     Сортировка для контейнера с указателями #9
Хм. нельзя ли пример, который можно попытаться скомпилировать? Вообще, предварительное объявление работает, проверено электроникой. Конкретно этот пример не проверял пока.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:17  [ТС]     Сортировка для контейнера с указателями #10
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'
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
28.08.2012, 16:21     Сортировка для контейнера с указателями #11
Вот так компилируется:
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 Посмотреть сообщение
Ругается на переобъявление
Компилятор какой?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.08.2012, 16:22     Сортировка для контейнера с указателями #12
nexen, http://liveworkspace.org/code/dc5bfa...d5bc3bfcab4917 ошибок нет
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:23  [ТС]     Сортировка для контейнера с указателями #13
Jupiter, find_if идет за O(n). Если перегрузить find - то O(logN)
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
28.08.2012, 16:24     Сортировка для контейнера с указателями #14
Цитата Сообщение от nexen Посмотреть сообщение
Вот сама ошибка : error C2039: 'a' : is not a member of 'B'
Это не на переобъявление. Это переменная 'a' не создалась, видимо из-за неизвестности vector, который в пространстве std.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:26  [ТС]     Сортировка для контейнера с указателями #15
grizlik78, оу. Чувствую себя теперь.. не очень >_<""

А вот про find всё же интересно.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.08.2012, 16:32     Сортировка для контейнера с указателями #16
Цитата Сообщение от nexen Посмотреть сообщение
find_if идет за O(n). Если перегрузить find - то O(logN)
ну дык это для указателей которые ты хранишь, а ты хочешь искать значения! храни тогда значения вместо указателей и будет тебе O(logN)
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:37  [ТС]     Сортировка для контейнера с указателями #17
Jupiter, таки все указатели отсортированы именно по значению num. Ну а раз я ищу тоже по значению num, то и должно быть logN, разве нет?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.08.2012, 17:32     Сортировка для контейнера с указателями #18
Цитата Сообщение от nexen Посмотреть сообщение
таки все указатели отсортированы именно по значению num. Ну а раз я ищу тоже по значению num, то и должно быть logN, разве нет?
да все верно, но сделать перегрузку find без наследования нельзя
как вариант сделать свою функцию(глобальную) которая будет создавать MYSTRUC с нужным значением и вызывать метод find для мапы
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 18:37  [ТС]     Сортировка для контейнера с указателями #19
Хочу вернуться к функторам.
Возможно ли сделать так :
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2012, 18:52     Сортировка для контейнера с указателями
Еще ссылки по теме:

Сортировка контейнера list C++
Свой компаратор для контейнера set C++
C++ Использование контейнера set для создания словаря

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

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 18:52     Сортировка для контейнера с указателями #20
указаны декларации. чтобы обращатся к методам\мемберам класса, в точке этого обращения класс уже должен быть определен, простого объявления недостаточно. т.е. перед кодом b->... должно быть определение или инклуд с определением класса Room, User и т.п.
Yandex
Объявления
28.08.2012, 18:52     Сортировка для контейнера с указателями
Ответ Создать тему
Опции темы

Текущее время: 02:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru