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

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

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

Сообщений: 11445


Просмотр профиля
« : Март 31, 2013, 18:00 »

Добрый день

Есть такая структурка

Код
C++ (Qt)
struct CMatrix {
double m[16];
 
bool operator == ( const CMatrix & sec ) const
{
  for (size_t i = 0; i < 16; ++i)
   if (fabs(m[i] - sec.m[i]) > epsilon)
    return false;
 
 return true;
}
};
Как теперь определить оператор < для использования напр в std::map ?

Спасибо
« Последнее редактирование: Март 31, 2013, 18:03 от Igors » Записан
RedDog
Гость
« Ответ #1 : Март 31, 2013, 18:33 »

А как он должен действовать? Может суммы сравнивать?
тогда примерно так:
Код:
bool operator < ( const CMatrix & sec ) const
 {
   return sum(m[0], m[15]) < sum(sec.m[0], sec.m[15]);
 }
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #2 : Март 31, 2013, 18:36 »

Как теперь определить оператор < для использования напр в std::map ?
Оператор < для для использования в std::map никак не связан с оператором ==, поэтому можно как угодно определить, удовлетворяя StrictWeakOrdering. Например, сравнивая лексикографически.

А если же вдруг появится дополнительное требование, чтобы отношение эквивалентности из оператора <, определяемое как !(x < y) && !(y < x), совпадало с отношением, определяемым оператором ==, то это невозможно, т.к. приведенный выше оператор == не транзитивный, а StrictWeakOrdering требует транзитивности.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Март 31, 2013, 18:43 »

Например, сравнивая лексикографически.
по-моему это абсолютно естественный вариант
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Март 31, 2013, 18:47 »

А как он должен действовать? Может суммы сравнивать?
Мне хотелось бы побыть в роли незнающего, которому вумные люди покажут "как правильно" - а Вы сразу встречный вопрос(ы), типа творческая дискуссия - я на это не подписывался  Улыбающийся

Оператор < для для использования в std::map никак не связан с оператором ==, поэтому можно как угодно определить, удовлетворяя StrictWeakOrdering. Например, сравнивая лексикографически.

А если же вдруг появится дополнительное требование, чтобы отношение эквивалентности из оператора <, определяемое как !(x < y) && !(y < x), совпадало с отношением, определяемым оператором ==, то это невозможно, т.к. приведенный выше оператор == не транзитивный, а StrictWeakOrdering требует транзитивности.
Я понял все что Вы сказали - ну а делать-то что?  Улыбающийся  Кстати мое первое впечатление было подобным - недостижимо именно из-за требований транзитивности

по-моему это абсолютно естественный вариант
Но не дающий разумных результатов
Записан
Fat-Zer
Гость
« Ответ #5 : Март 31, 2013, 18:52 »

Например, сравнивая лексикографически.
по-моему это абсолютно естественный вариант
только вот матрицы, для которых operator==() будет возвращать труъ, будут добавляться по нескольку раз...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 31, 2013, 19:01 »

только вот матрицы, для которых operator==() будет возвращать труъ, будут добавляться по нескольку раз...
Совершенно верно, матрицы могут быть реально равны/идентичны но из-за неизбежной погрешности double "точное" сравнение вернет false

[/offtop]
У меня одного впечатление что форум как-то приуныл, много дней "нiчого цiкавого"?
Well, "Good Times Bad Times"  Улыбающийся
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #7 : Март 31, 2013, 19:09 »

ну а делать-то что?
Использовать другие структуры данных, т.к. std::map здесь явно не подходит.
Записан
Fat-Zer
Гость
« Ответ #8 : Март 31, 2013, 19:21 »

может через std::unordered_map сделать?
hash примерно такая будет:
Код:
size_t hash<CMatrix>(const CMatrix & M) {
  return hash<double>( round(sum(M.m), 16*epsilon) );
}
// round(v, e) - округление числа v с точностью не больше e
// с ходу для неё формула не придумывается...
« Последнее редактирование: Март 31, 2013, 19:24 от Fat-Zer » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Март 31, 2013, 19:24 »

Использовать другие структуры данных, т.к. std::map здесь явно не подходит.
Вариант, но дороговато выходит (напр свое дерево), "при прочих равных условиях" std предпочтительнее (как справедливо рекомендует наш модератор). Нет ли ходов попрактичнее?
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #10 : Март 31, 2013, 19:35 »

Вариант, но дороговато выходит (напр свое дерево), "при прочих равных условиях" std предпочтительнее (как справедливо рекомендует наш модератор). Нет ли ходов попрактичнее?
В std нет контейнеров для spatial indexing, поэтому или самому реализовывать или брать какие-то готовые реализации.
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #11 : Март 31, 2013, 19:37 »

может через std::unordered_map сделать?
Не будет корректно работать, т.к. найдутся два элемента a==b, для которых будут разные значения функции hash.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #12 : Март 31, 2013, 19:51 »

А как он должен действовать? Может суммы сравнивать?
Мне хотелось бы побыть в роли незнающего, которому вумные люди покажут "как правильно" - а Вы сразу встречный вопрос(ы), типа творческая дискуссия - я на это не подписывался  Улыбающийся
Уже сам факт того, что Вас совершенно не смущает (или судя по постановки вопроса, для Вас это совершенно естественно) определять для такой структуры как матрица (похоже матрица 4x4) оператор <, вызывает как минимум сомнения в адекватности подхода к проблеме..
Может стоит отмотать несколько шагов назад и задаться вопросом что привело к такой безапелляционной мысли писать этот совершенно не свойственной для матриц оператор?

И потом, для матриц нет однозначного оператора < ... Их можно придумать бесконечное множество реализаций (в зависимости от Вашего настроения или положения звёзд и т.д.)...
А теперь подумайте о том, кто будет использовать Ваш код..

В общем это очень, подчёркиваю, очень плохая идея(
    
Записан

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

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

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Март 31, 2013, 20:01 »

Может стоит отмотать несколько шагов назад и задаться вопросом что привело к такой безапелляционной мысли писать этот совершенно не свойственной для матриц оператор?
Реализация оператора это уже последствия, мне интересней для чего может понадобиться использовать матрицы в качестве ключа коллекции?
Что-то мне подсказывает, что лучше изменить архитектуру, что бы не приходилось так делать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Март 31, 2013, 20:28 »

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

Реализация оператора это уже последствия, мне интересней для чего может понадобиться использовать матрицы в качестве ключа коллекции?
Что-то мне подсказывает, что лучше изменить архитектуру, что бы не приходилось так делать.
Ага, а вот и "тип из второго батальона", рад его видеть  Улыбающийся Ну ладно m_ax - молодой, увлекается "синтаксическим сахаром", это пройдет. Но Вы-то - человек с немалым опытом - как насчет упереться рогом и подумать - или четко доказать что это невозможно. А то сразу в кусты, мол, меняем архитектуру  Улыбающийся
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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