- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
typedef std::map<std::string, WORD> Values;
struct Less {
bool operator()(Values::value_type const& left
, Values::value_type const& right) const {
if (right.second == TEMPERATURE_UNKNOWN
|| left.second == TEMPERATURE_UNKNOWN) {
return false;
}
short const signed_left = *reinterpret_cast<short const*>(&left.second);
short const signed_right = *reinterpret_cast<short const*>(&right.second);
bool const result = signed_left < signed_right;
return result;
}
};
Строки 10 и 11.
20+ опыта в С++ у чувачка.
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 будут проблемы, а сишный каст сработает как надо.