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

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

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

Author24 — интернет-сервис помощи студентам
Понадобилось сделать контейнер указателей, но встала проблема сортировки и типа контейнера :
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2012, 12:29
Ответы с готовыми решениями:

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

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

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

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

26
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
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-й параметр шаблона - компаратор
1
187 / 180 / 25
Регистрация: 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
}
Как такое сделать?
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
28.08.2012, 15:54 4
Цитата Сообщение от nexen Посмотреть сообщение
Возможна ли подобная конструкция каким-либо способом
А в чём проблема?
1
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
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
};
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:05  [ТС] 6
grizlik78, проблема в том, что первый не видит второй, либо наоборот, ведь нельзя указать прототип класса. Хотя, даже если каким-то чудом увидит, вопрос будет в размерах. Ведь размер A зависит от B, а B от A. В таком случае, размер и A, и B - сколько угодно.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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 - сколько угодно.
У указателей размеры одинаковы и известны. Так что никаких проблем с размерами нет, пока указатель не попытаются разыменовать.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:14  [ТС] 8
grizlik78, и у тебя такое прокатывает? У меня ругань на class B;. Говорит, что переобъявлен класс : o
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
28.08.2012, 16:16 9
Хм. нельзя ли пример, который можно попытаться скомпилировать? Вообще, предварительное объявление работает, проверено электроникой. Конкретно этот пример не проверял пока.
1
187 / 180 / 25
Регистрация: 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'
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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 Посмотреть сообщение
Ругается на переобъявление
Компилятор какой?
1
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.08.2012, 16:22 12
nexen, http://liveworkspace.org/code/... 3bfcab4917 ошибок нет
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:23  [ТС] 13
Jupiter, find_if идет за O(n). Если перегрузить find - то O(logN)
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
28.08.2012, 16:24 14
Цитата Сообщение от 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  [ТС] 15
grizlik78, оу. Чувствую себя теперь.. не очень >_<""

А вот про find всё же интересно.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.08.2012, 16:32 16
Цитата Сообщение от nexen Посмотреть сообщение
find_if идет за O(n). Если перегрузить find - то O(logN)
ну дык это для указателей которые ты хранишь, а ты хочешь искать значения! храни тогда значения вместо указателей и будет тебе O(logN)
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.08.2012, 16:37  [ТС] 17
Jupiter, таки все указатели отсортированы именно по значению num. Ну а раз я ищу тоже по значению num, то и должно быть logN, разве нет?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.08.2012, 17:32 18
Цитата Сообщение от nexen Посмотреть сообщение
таки все указатели отсортированы именно по значению num. Ну а раз я ищу тоже по значению num, то и должно быть logN, разве нет?
да все верно, но сделать перегрузку find без наследования нельзя
как вариант сделать свою функцию(глобальную) которая будет создавать MYSTRUC с нужным значением и вызывать метод find для мапы
1
187 / 180 / 25
Регистрация: 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
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
28.08.2012, 18:52 20
указаны декларации. чтобы обращатся к методам\мемберам класса, в точке этого обращения класс уже должен быть определен, простого объявления недостаточно. т.е. перед кодом b->... должно быть определение или инклуд с определением класса Room, User и т.п.
1
28.08.2012, 18:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2012, 18:52
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru