Russian Qt Forum
Ноябрь 23, 2024, 07:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: оператор < для указателей  (Прочитано 8421 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Декабрь 18, 2014, 11:41 »

Добрый день

Структура имеет оператор <, но в др контейнере (напр std::map) надо xранить не саму структуру, а указатель на нее. Приходится как-то так
Код
C++ (Qt)
struct MyPtr {
 MyPtr( MyStruct * ptr = 0 ) : MPtr(ptr) {}
 
 bool operator < ( const MyPtr & sec ) const
 {
   if (!mPtr) return sec.mPtr != 0;  // указатели могут быть NULL
   if (!sec.mPtr) return false;
 
   return *mPtr < *sec.mPtr;
 }
 
 MyStruct * mPtr;
};
Конечно можно перекрывать сравнения в контейнерах (хранящих указатели), но это не выгоднее. Нет ли удобного стандартного решения?

Спасибо
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Декабрь 18, 2014, 13:11 »

не совсем понятен вопрос...

покажите в коде где и что вы сравниваете, и как хотелось бы
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 18, 2014, 13:39 »

не совсем понятен вопрос...

покажите в коде где и что вы сравниваете, и как хотелось бы
Пример
Код
C++ (Qt)
std::map <MyStruct *, int> theMap;
Так будут сравниваться указатели и для каждого MyStruct храниться свое значение int. А надо чтобы одно значение хранилось для всех одинаковых MyStruct
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Декабрь 19, 2014, 11:34 »

А что понимается под "одинаковыми" структурами? Их указатели или содержимое? Все равно не понимаю вопроса.
Скорее всего вы не совсем полностью описали что хотите получить или входные данные. Так как я читаю и в упор не вижу проблемы.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Декабрь 19, 2014, 11:36 »

Так кажется я начал понимать. Вам нужно что бы ваши структуры выступали в качестве ключей в мапе и по ним шла сортировка? Я так понимаю?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Декабрь 19, 2014, 11:37 »

Так кажется я начал понимать. Вам нужно что бы ваши структуры выступали в качестве ключей в мапе и по ним шла сортировка? Я так понимаю?
Да, ты правильно понял. И чтобы сравнивались не указатели, а внутренние данные.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Декабрь 19, 2014, 12:07 »

Так кажется я начал понимать. Вам нужно что бы ваши структуры выступали в качестве ключей в мапе и по ним шла сортировка? Я так понимаю?
Совершенно верно. Но сами структуры при этом хранятся в др месте и копированию не подлежат. Пример: удалить повторяющиеся эл-ты из контейнера не меняя при этом порядок оставшихся

А что понимается под "одинаковыми" структурами? Их указатели или содержимое?
Содержимое, как это определено оператором < для структуры
« Последнее редактирование: Декабрь 19, 2014, 12:09 от Igors » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #7 : Декабрь 19, 2014, 12:34 »

Храните в мапе не указатели, а обёртки, для которых определяйте операторы:

Код
C++ (Qt)
template <class T>
class pointer_wrapper
{
public:
   pointer_wrapper(const T * p) : ptr(p) {}
 
   template <class R>
   friend bool operator<(const pointer_wrapper<R> &, const pointer_wrapper<R>&);
 
private:
   const T * ptr;
};
 
template <class R>
bool operator<(const pointer_wrapper<R> & x, const pointer_wrapper<R> & y)
{
   return *(x.ptr) < *(y.ptr);
}
 
 
std::map <pointer_wrapper<MyStruct> , int> theMap;
 

 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Декабрь 19, 2014, 13:13 »

Главное - сунуть template, а там хоть трава не расти Плачущий  Как же мне достучаться до ptr? (хоть бы оператор -> перекрыли). С какой радости он const? И как помещать его в контейнер без конструктора по умолчанию? Имя pointer_wrapper лишено всякой определенности. А проверяться на NULL нам недосуг - надо ж бежать что-то еще "обобщать"

Да уж, "техника на грани фантастики" - простую идею оформить не можем. Но неужели такой простой вещи нет в бусте  Непонимающий Непонимающий Не верю, наверное плохо смотрели
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #9 : Декабрь 19, 2014, 13:32 »

Цитировать
Как же мне достучаться до ptr?
ну если это вызывает такие сложности..

Цитировать
С какой радости он const?
Это просто пример, иллюстрирующий мысль.. const он или не const уже вам решать.. Я предположил, что если он используется в качестве ключа в мапе, то логичнее сделать указатель константным, в противном случае, если вы через ключ пытаетесь и данные его поменять, то это уже что-то нечто.. (хотя чему я удивляюсь..)

Цитировать
А проверяться на NULL нам недосуг - надо ж бежать что-то еще "обобщать"

Проверяйте, это не сложно..

Цитировать
И как помещать его в контейнер без конструктора по умолчанию?
А как вы ключ-значение в мап добавляете?

Код
C++ (Qt)
MyStruct * myStruct;
theMap[myStruct] = 1;
...
 
theMap[pointer_wrapper(myStruct)] = 1;
...
 
какие здесь могут проблемы возникнуть?



Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Декабрь 19, 2014, 13:52 »

Главное - сунуть template, а там хоть трава не расти Плачущий  Как же мне достучаться до ptr? (хоть бы оператор -> перекрыли). С какой радости он const? И как помещать его в контейнер без конструктора по умолчанию? Имя pointer_wrapper лишено всякой определенности. А проверяться на NULL нам недосуг - надо ж бежать что-то еще "обобщать"

Да уж, "техника на грани фантастики" - простую идею оформить не можем. Но неужели такой простой вещи нет в бусте  Непонимающий Непонимающий Не верю, наверное плохо смотрели
Тебе дали идею, а ты придираешься к реализации. Нафига человеку все реализовывать, чтобы показать саму идею?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Декабрь 19, 2014, 14:21 »

А как вы ключ-значение в мап добавляете?
Код
C++ (Qt)
MyStruct * myStruct;
theMap[myStruct] = 1;
...
 
theMap[pointer_wrapper(myStruct)] = 1;
...
 
А зачем pointer_wrapper() если есть конструктор принимающий такой тип?

Тебе дали идею, а ты придираешься к реализации. Нафига человеку все реализовывать, чтобы показать саму идею?
Если хотели "дать идею" то можно было напр так
Цитировать
Не слышал про такое, но это легко сделать темплейтом
А если приводить код - так уж приводить, пусть неполный но без ляпов на каждом шагу.

Да, но ведь это "велосипед" - а я хочу стандартными средствами  Улыбающийся
« Последнее редактирование: Декабрь 19, 2014, 14:24 от Igors » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #12 : Декабрь 19, 2014, 16:09 »

А вот интересно.
Что у нас будет с мэпом, когда мы возьмем и по неконстантному указателю модифицируем объект?
Загнется?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Декабрь 19, 2014, 16:43 »

А вот интересно.
Что у нас будет с мэпом, когда мы возьмем и по неконстантному указателю модифицируем объект?
Загнется?
Что считать "загнется"? Улыбающийся
Может перестать находить значение по "новому" ключу.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #14 : Декабрь 19, 2014, 16:49 »

Может перестать находить значение по "новому" ключу.
А на вставку и нахождение других значений никак не повлияет?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.27 секунд. Запросов: 23.