Size: a a a

2020 July 18

ПК

Побитый Кирпич... in supapro.cxx
мало ли что там пишут.

Что будет если ты сделаешь не лексикографическое сравнение, будет ли это нарушением контракта?
Что будет если ты напишешь max_element до определения своего оператора сравнения, потом напишешь оператор сравнения и после него снова max_element? Ато и в разных TU напишешь. Подозреваю что тут будет ODR violation то есть UB
источник

ПК

Побитый Кирпич... in supapro.cxx
Эти риски не целесообразны
источник

VS

Void Space01 in supapro.cxx
Если я правильно понимают, то pair - это шаблонный класс, но при перегрузке оператора для pair<MyClass, int> произойдет перегрузка оператора только для этого конкретного класса созданного на основе шаблона, а не для всего шаблона. Так что проблемы быть не должно.
источник

ПК

Побитый Кирпич... in supapro.cxx
Void Space01
Если я правильно понимают, то pair - это шаблонный класс, но при перегрузке оператора для pair<MyClass, int> произойдет перегрузка оператора только для этого конкретного класса созданного на основе шаблона, а не для всего шаблона. Так что проблемы быть не должно.
Ты моё сообщение прочитай и ответь на второй вопрос
источник

ПК

Побитый Кирпич... in supapro.cxx
Void Space01
Если я правильно понимают, то pair - это шаблонный класс, но при перегрузке оператора для pair<MyClass, int> произойдет перегрузка оператора только для этого конкретного класса созданного на основе шаблона, а не для всего шаблона. Так что проблемы быть не должно.
max_element(my_map.begin(), my_map.end());

bool operator < (...) { ... }

max_element(my_map.begin(), my_map.end());

Что будет?
источник

VS

Void Space01 in supapro.cxx
мне кажется это некорректный пример, у тебя же оператор будет перегружен вместе с реализацией my_map, соответственно все вызовы буду позже.
источник

VS

Void Space01 in supapro.cxx
ну ок, теоретически так можно сделать, тогда во втором случае наверно max_element сработает по другому, чем в первом.
источник

VS

Void Space01 in supapro.cxx
Но какая проблема, это же то же самое что мы бы вызвали эти функции с разными функциями сравнения?
источник

ПК

Побитый Кирпич... in supapro.cxx
Void Space01
ну ок, теоретически так можно сделать, тогда во втором случае наверно max_element сработает по другому, чем в первом.
То есть в твоей программе будут две функции max_element с идентичными сигнатурами но разными телами. Это кейс ODR violation, то есть UB
источник

ПК

Побитый Кирпич... in supapro.cxx
Void Space01
Но какая проблема, это же то же самое что мы бы вызвали эти функции с разными функциями сравнения?
С передачей функции нет ODR violation
источник

d

disba1ancer in supapro.cxx
Void Space01
Привет. Подскажите у меня есть std::map<MyClass, int> MyMap хочу красиво получить максимальное значение int  в MyMap. Соответственно использую std::max_element. Хочется использовать вызов max_element не через передачу функции сравнения, а через перегрузку оператора меньше. Так вот, собственно вопрос: для каких типов надо перегрузить оператор? Я пробовал для const pair<MyClass, int>& и это работает неправильно.
чем компаратор не устроил?
источник

ПК

Побитый Кирпич... in supapro.cxx
Если я всё правильно понимаю, то компилятор может смекнуть, что между вызовами max_element содержимое my_map не менялось и соптимизировать второй вызов :)
источник

VS

Void Space01 in supapro.cxx
Побитый Кирпич
То есть в твоей программе будут две функции max_element с идентичными сигнатурами но разными телами. Это кейс ODR violation, то есть UB
Тогда с твоих слов получается что и для контейнеров нельзя перегружать операторы. Т.е. нельзя к примеру bool operator==(const map<MyClass, string>& lhw, const map<MyClass, string>& rhw)?
источник

VS

Void Space01 in supapro.cxx
disba1ancer
чем компаратор не устроил?
Просто хочу разобраться можно ли так писать или нет.
источник

ПК

Побитый Кирпич... in supapro.cxx
Void Space01
Тогда с твоих слов получается что и для контейнеров нельзя перегружать операторы. Т.е. нельзя к примеру bool operator==(const map<MyClass, string>& lhw, const map<MyClass, string>& rhw)?
Вообще перегрузка операторов для std типов это гавнокод и потенциальное UB
источник

ПК

Побитый Кирпич... in supapro.cxx
Да и для любых чужих тоже могут быть риски
источник

ПК

Побитый Кирпич... in supapro.cxx
Void Space01
Просто хочу разобраться можно ли так писать или нет.
Писать можно, работа правильная не гарантируется. Такой ответ устроит?
источник

CD

Constantine Drozdov in supapro.cxx
Побитый Кирпич
Вообще перегрузка операторов для std типов это гавнокод и потенциальное UB
Потенциальное?)
источник

CD

Constantine Drozdov in supapro.cxx
#include <tuple>
#include <vector>
#include <algorithm>

bool operator < (std::pair<int, int>, std::pair<int, int>) {
   throw 0;
}

int main() {
   std::vector<std::pair<int, int>> v = {
       { 0, 0 },
       { 1, 1 }
   };
   std::sort(v.begin(), v.end());
   //v[0] < v[1];
}

как вы думаете, какой результат этой работы этой программы?
источник

VS

Void Space01 in supapro.cxx
Подожди. Понятно что для базовых типов не надо перегружать операции, например для vector<int> и т.д. Но  вы меня пока не убедили что нельзя перегружать оператор для vector<MyClass>.
источник