Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Да умные тоже обосрутся. Они же не будут думать про четвёртый случай, когда из a < b и a > b не следует a == b. В самом-самом лучшем случае - ассёртнутся, когда увидят, что неравенство треугольника пошло по пизде.
> P.S. Интересно, можно ли так подобрать положение undefined'ов, чтобы quick sort вообще нихуя не отсортировал?
Результат сортировки состоит из отсортированных цепочек, соединённых друг с другом значением TEMPERATURE_UNKNOWN. Цепочки относительно друг друга вообще никак не упорядочены, хотя внутри каждой цепочки порядок.
Если мы возьмём N нормальных значений, разделённых (N-1) элементом со значением TEMPERATURE_UNKNOWN, то можно надеяться, что сортировка ничего качественно не изменит.
Короче там introsort - адовый гибрид сортировки вставками, хипсорта и квиксорта...
И на маленьких массивах, походу, должны юзаться вставки. А их не наебёшь кривым сравнением. В худшем случае просто не по ту сторону SPECIAL'а значение закинут.
А вот квиксорт в теории, можно пнуть по яйцам, вставив в начало, в конец и в середину SPECIAL. Тогда он посчитает, что все числа в массиве одинаковые и ничего не будет сортировать...
Компаратор нам дан свыше, автором кода. Его нельзя менять.
А вот если входными данными получится поломать сортировку, то есть вероятность триггернуть какие-то баги, стоящие после неё (если код надеется на упорядоченность) и, может быть, написать какой-то эксплойт :3
Враг вступает в город, пленных не щадя, от того, что в кузнице не было гвоздя.
а, вот о чем речь.
Ну тогда включим безупречную логику
Если температура не определена - то она может быть любой, что и отражается в этой функции - не определенная температура равна любой
Она не просто любая, она переменная. В примере Борманда (http://ideone.com/yDG5HJ) она в один момент оказалась меньше четырёх, а в другой — больше семи. Т. е. она может меняться прямо во время расчёта!
Эти три строчки ломают к хуям все математические свойства сравнения отношения порядка и превращают сортировки, поиск и мапы в треш с undefined behavior.
ИМХО эта мапа вполне работоспособна, т.к. используется отношение порядка для std::string. А чтобы отсортировать эти хреновины в std::vector< std::pair<const std::string, WORD> > можно сначала выкинуть элементы с TEMPERATURE_UNKNOWN в конец коллекции при помощи std::remove_if, а потом отсортировать оставшееся. Но reinterpret_cast тут, конечно, нужен как рыбе зонтик.
> но в 6 и 7 сравнение
Ну и что? Из-за этих строчек получившийся Less в принципе непригоден для сортировки. И как компаратор для мапы. И для двоичного поиска. И даже для линейного поиска. Он вообще ни для чего не пригоден, если TEMPERATURE_UNKNOWN может попасться во входных данных.
По сравнению с этим reinterpret_cast указателя на unsigned short (WORD же так определён?) в указатель на short и разадресация - это так, детская шалость... Ну хотя да, на разнице в размерах short и WORD можно тоже словить UB.
Ну на какой-нибудь гипотетической платформе, где short не 16 (а 32 или 64, к примеру), а WORD задефайнен строго под 16. В жизни, скорее всего, не встретится. Но зачем создавать себе лишние проблемы? 🙂
> А в каких?
Думаю, при касте потомка к родителю в случае множественного наследования у reinterpret_cast будут проблемы, а сишный каст сработает как надо.
P.S. Интересно, можно ли так подобрать положение undefined'ов, чтобы quick sort вообще нихуя не отсортировал?
Нужно изобрести алгоритм, который сравнивает в обе стороны, т. е. проверяет и less(a, b), и less(b, a).
Результат сортировки состоит из отсортированных цепочек, соединённых друг с другом значением TEMPERATURE_UNKNOWN. Цепочки относительно друг друга вообще никак не упорядочены, хотя внутри каждой цепочки порядок.
Если мы возьмём N нормальных значений, разделённых (N-1) элементом со значением TEMPERATURE_UNKNOWN, то можно надеяться, что сортировка ничего качественно не изменит.
P.P.S. Зря понадеялся. Частично всё равно сортируется:
http://ideone.com/xVulgU
{9, SPECIAL, 8, SPECIAL, 7, SPECIAL, 6, SPECIAL, 5, SPECIAL, 4} → 4 5 6 7 8 9 100500 100500 100500 100500 100500
http://ideone.com/jfkBI1
{1, SPECIAL, 2, SPECIAL, 3, SPECIAL, 4, SPECIAL, 5, SPECIAL, 6} → 1 100500 2 100500 3 100500 4 100500 5 100500 6
http://ideone.com/t2EXmp
пысы - у меня 12 ночи, сломалась мышка и жуткая лень - звиняйте если что не так
Чуть выше была ссылка, которую ты прозевал:
http://ideone.com/xVulgU
{1, SPECIAL, 2, SPECIAL, 3, SPECIAL, 4, SPECIAL, 5, SPECIAL, 6}.
И на маленьких массивах, походу, должны юзаться вставки. А их не наебёшь кривым сравнением. В худшем случае просто не по ту сторону SPECIAL'а значение закинут.
А вот квиксорт в теории, можно пнуть по яйцам, вставив в начало, в конец и в середину SPECIAL. Тогда он посчитает, что все числа в массиве одинаковые и ничего не будет сортировать...
{SPECIAL,SPECIAL,SPECIAL,SPECIAL,SPECIAL ,SPECIAL,SPECIAL,SPECIAL,SPECIAL}.
хотя он отсортирован по дефолту, но если юзать только операцию меньше, то сортироваться некоторыми сортировками он будет вечно
А вот если входными данными получится поломать сортировку, то есть вероятность триггернуть какие-то баги, стоящие после неё (если код надеется на упорядоченность) и, может быть, написать какой-то эксплойт :3
Враг вступает в город, пленных не щадя, от того, что в кузнице не было гвоздя.
Ну тогда включим безупречную логику
Если температура не определена - то она может быть любой, что и отражается в этой функции - не определенная температура равна любой
undefined === undefined?
Думай хоть о Паскале.
Это пищдец, гваждане.
Можно подробнее, как он его юзает для find_if?
Я про то, что этот Less нельзя юзать как компаратор для какой-то мапы. Да и вообще ни для чего нельзя.
> можно сначала выкинуть элементы
А можно просто пофиксить Less и не ломать голову...
Больше радует реинтерпрет каст к поинтеру и потом обратно к значению.
Ну и что? Из-за этих строчек получившийся Less в принципе непригоден для сортировки. И как компаратор для мапы. И для двоичного поиска. И даже для линейного поиска. Он вообще ни для чего не пригоден, если TEMPERATURE_UNKNOWN может попасться во входных данных.
По сравнению с этим reinterpret_cast указателя на unsigned short (WORD же так определён?) в указатель на short и разадресация - это так, детская шалость... Ну хотя да, на разнице в размерах short и WORD можно тоже словить UB.
Еще доставляет - const_iterator const.
Ну вот накуя, а?
Ooops...
http://ideone.com/asWouQ
Ясно, что макс_елемент просто проходит по всему контейнеру.
В чём смысл подобных трюков? Зачем через указатели?
Вот и говнокодит.
Сидит, чавкает, кряхтит, жалуется.
Типичный долбодятел. Зато ЧСВ - пипец.
У меня прабабушке уже 100 с хвостоком - мозги и память - дай Бог каждому. А все потому что не смотрит это ваше анимэ
short signed_left = static_cast<short>(left.second);
Переусложнение на пустом месте.
Он слишком опасный, уж лучше использовать освящённый самим Страуструпом reinterpret_cast.
А в каких?
Думаю, при касте потомка к родителю в случае множественного наследования у reinterpret_cast будут проблемы, а сишный каст сработает как надо.