- 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+ опыта в С++ у чувачка.
bormand 21.11.2015 19:34 # 0
kegdan 21.11.2015 20:03 # 0
bormand 21.11.2015 20:05 # 0
inkanus-gray 21.11.2015 20:20 # 0
bormand 21.11.2015 20:25 # 0
bormand 21.11.2015 20:29 # +1
P.S. Интересно, можно ли так подобрать положение undefined'ов, чтобы quick sort вообще нихуя не отсортировал?
inkanus-gray 21.11.2015 20:34 # 0
Нужно изобрести алгоритм, который сравнивает в обе стороны, т. е. проверяет и less(a, b), и less(b, a).
bormand 21.11.2015 20:37 # +3
bormand 21.11.2015 20:43 # +2
inkanus-gray 21.11.2015 20:45 # 0
Результат сортировки состоит из отсортированных цепочек, соединённых друг с другом значением TEMPERATURE_UNKNOWN. Цепочки относительно друг друга вообще никак не упорядочены, хотя внутри каждой цепочки порядок.
Если мы возьмём N нормальных значений, разделённых (N-1) элементом со значением TEMPERATURE_UNKNOWN, то можно надеяться, что сортировка ничего качественно не изменит.
P.P.S. Зря понадеялся. Частично всё равно сортируется:
http://ideone.com/xVulgU
inkanus-gray 21.11.2015 20:50 # 0
{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
kegdan 21.11.2015 20:54 # 0
inkanus-gray 21.11.2015 20:57 # 0
kegdan 21.11.2015 21:00 # 0
пысы - у меня 12 ночи, сломалась мышка и жуткая лень - звиняйте если что не так
inkanus-gray 21.11.2015 21:01 # 0
kegdan 21.11.2015 21:02 # 0
inkanus-gray 21.11.2015 21:04 # 0
Чуть выше была ссылка, которую ты прозевал:
http://ideone.com/xVulgU
bormand 21.11.2015 20:54 # 0
inkanus-gray 21.11.2015 20:59 # 0
{1, SPECIAL, 2, SPECIAL, 3, SPECIAL, 4, SPECIAL, 5, SPECIAL, 6}.
bormand 21.11.2015 21:09 # +2
И на маленьких массивах, походу, должны юзаться вставки. А их не наебёшь кривым сравнением. В худшем случае просто не по ту сторону SPECIAL'а значение закинут.
А вот квиксорт в теории, можно пнуть по яйцам, вставив в начало, в конец и в середину SPECIAL. Тогда он посчитает, что все числа в массиве одинаковые и ничего не будет сортировать...
kegdan 21.11.2015 21:15 # 0
bormand 21.11.2015 21:16 # 0
kegdan 21.11.2015 21:18 # 0
{SPECIAL,SPECIAL,SPECIAL,SPECIAL,SPECIAL ,SPECIAL,SPECIAL,SPECIAL,SPECIAL}.
хотя он отсортирован по дефолту, но если юзать только операцию меньше, то сортироваться некоторыми сортировками он будет вечно
bormand 21.11.2015 21:18 # 0
kegdan 21.11.2015 21:21 # +2
kegdan 21.11.2015 21:26 # +1
bormand 21.11.2015 21:29 # +2
А вот если входными данными получится поломать сортировку, то есть вероятность триггернуть какие-то баги, стоящие после неё (если код надеется на упорядоченность) и, может быть, написать какой-то эксплойт :3
Враг вступает в город, пленных не щадя, от того, что в кузнице не было гвоздя.
guest 21.11.2015 21:42 # 0
kegdan 22.11.2015 00:40 # +1
bormand 22.11.2015 01:17 # +1
kegdan 22.11.2015 04:25 # 0
kegdan 22.11.2015 05:37 # +1
kegdan 21.11.2015 20:29 # +1
Ну тогда включим безупречную логику
Если температура не определена - то она может быть любой, что и отражается в этой функции - не определенная температура равна любой
inkanus-gray 21.11.2015 20:38 # 0
kegdan 21.11.2015 20:42 # +1
bormand 21.11.2015 20:08 # +1
inkanus-gray 21.11.2015 20:17 # 0
guest 21.11.2015 20:19 # +1
undefined === undefined?
inkanus-gray 21.11.2015 20:22 # +1
guest 21.11.2015 20:30 # 0
Думай хоть о Паскале.
dxd 22.11.2015 17:24 # 0
1024-- 22.11.2015 17:45 # +2
guest 21.11.2015 20:18 # 0
Это пищдец, гваждане.
bormand 21.11.2015 20:20 # 0
Можно подробнее, как он его юзает для find_if?
guest 21.11.2015 20:31 # 0
MinorThreat 24.11.2015 14:05 # 0
bormand 24.11.2015 17:28 # 0
Я про то, что этот Less нельзя юзать как компаратор для какой-то мапы. Да и вообще ни для чего нельзя.
> можно сначала выкинуть элементы
А можно просто пофиксить Less и не ломать голову...
guest 21.11.2015 20:10 # 0
bormand 21.11.2015 20:10 # 0
guest 21.11.2015 20:13 # 0
Больше радует реинтерпрет каст к поинтеру и потом обратно к значению.
bormand 21.11.2015 20:19 # 0
Ну и что? Из-за этих строчек получившийся Less в принципе непригоден для сортировки. И как компаратор для мапы. И для двоичного поиска. И даже для линейного поиска. Он вообще ни для чего не пригоден, если TEMPERATURE_UNKNOWN может попасться во входных данных.
По сравнению с этим reinterpret_cast указателя на unsigned short (WORD же так определён?) в указатель на short и разадресация - это так, детская шалость... Ну хотя да, на разнице в размерах short и WORD можно тоже словить UB.
inkanus-gray 21.11.2015 20:27 # 0
guest 21.11.2015 20:34 # 0
inkanus-gray 21.11.2015 20:35 # 0
1024-- 21.11.2015 20:54 # +1
guest 21.11.2015 21:06 # −1
guest 21.11.2015 20:33 # 0
Еще доставляет - const_iterator const.
Ну вот накуя, а?
bormand 21.11.2015 20:35 # 0
guest 21.11.2015 20:40 # −1
guest 21.11.2015 20:39 # 0
bormand 21.11.2015 20:45 # 0
Ooops...
guest 21.11.2015 20:51 # +2
guest 21.11.2015 21:30 # 0
http://ideone.com/asWouQ
bormand 21.11.2015 21:34 # 0
guest 21.11.2015 21:49 # 0
Ясно, что макс_елемент просто проходит по всему контейнеру.
bormand 21.11.2015 22:49 # 0
guest 21.11.2015 20:41 # 0
В чём смысл подобных трюков? Зачем через указатели?
bormand 21.11.2015 20:49 # 0
guest 21.11.2015 20:45 # 0
bormand 21.11.2015 20:47 # 0
guest 21.11.2015 21:06 # +1
Вот и говнокодит.
bormand 21.11.2015 21:23 # +1
guest 21.11.2015 21:29 # 0
Сидит, чавкает, кряхтит, жалуется.
Типичный долбодятел. Зато ЧСВ - пипец.
inkanus-gray 21.11.2015 22:30 # 0
3_14dar 22.11.2015 05:43 # 0
kegdan 22.11.2015 06:21 # +4
У меня прабабушке уже 100 с хвостоком - мозги и память - дай Бог каждому. А все потому что не смотрит это ваше анимэ
Milonov 23.11.2015 19:45 # 0
guest 21.11.2015 21:41 # −1
Antervis 23.11.2015 05:30 # 0
bormand 23.11.2015 06:13 # 0
short signed_left = static_cast<short>(left.second);
Переусложнение на пустом месте.
roman-kashitsyn 23.11.2015 10:07 # +3
bormand 23.11.2015 12:08 # +1
roman-kashitsyn 23.11.2015 14:12 # +1
Он слишком опасный, уж лучше использовать освящённый самим Страуструпом reinterpret_cast.
Antervis 23.11.2015 14:56 # 0
roman-kashitsyn 23.11.2015 15:27 # 0
kegdan 23.11.2015 15:53 # 0
LispGovno 23.11.2015 16:47 # 0
А в каких?
roman-kashitsyn 23.11.2015 16:49 # 0
Думаю, при касте потомка к родителю в случае множественного наследования у reinterpret_cast будут проблемы, а сишный каст сработает как надо.
Antervis 24.11.2015 06:35 # 0