- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
auto getMaxSize = [](const auto &vec) {
if (vec.size() == 0)
return 0;
const auto &max = *std::max_element(
vec.begin(),
vec.end(),
[](const auto &lhs, const auto &rhs){
return lhs.size() < rhs.size();
});
return max.size();
};
kipar 23.06.2016 13:18 # +1
kurwa-nextgen 23.06.2016 13:23 # +4
Antervis 23.06.2016 14:24 # 0
Dummy00001 23.06.2016 14:05 # 0
Soul_re@ver 23.06.2016 14:31 # +1
Dummy00001 23.06.2016 14:55 # +2
с другой стороны, для меня как раз это всегда и было показательным примером того что С++ компилятор "не понимает" С++: `.size() == 0` это очевидно `.empty()` но соптимизировать это компилер просто в принципе не способен.
ЗЫ тут еще давеча пытался асфильтировать граблевое поле std::sort() vs .sort(). тоже не приятно. у листа есть .sort(), а вектор надо std::sort(). специализации std::sort() для листа - нет. `std::sort( container )` тоже нет. просто мля сказка: в одном месте поменял vector на list - и я уже не помню сколько мегов/гигов был лог ошибок билда.
Dummy00001 23.06.2016 14:59 # 0
... а что если попробовать питоновый вариант? .size() возвращает класс, в котором перекрыты операции сравнения? там же понадобится и оператор конверсии в число. вопрос у чего будет приоритет: операторов сравнения или оператора конверсии.
Antervis 23.06.2016 15:39 # 0
Dummy00001 23.06.2016 15:47 # 0
в С++99 контейнеры не кэшировали колво элементов, почему вызов .size() для дерева или связного списка был тупым проходом по структуре. а .empty() это всего лишь проверка есть ли вообще элементы. в дереве - root == NULL, в связном списке - head == NULL.
Antervis 23.06.2016 16:39 # 0
Dummy00001 23.06.2016 16:50 # +1
bormand 23.06.2016 21:42 # +3
Бля, он переполнение что ли ожидает и из-за этого боится выбрасывать цикл?
bormand 23.06.2016 21:45 # +5
Сайзтэбляди соснули! Вот что UB животворящий делает!
Dummy00001 23.06.2016 21:56 # +3
ЗЫ не только переполнение - вечный цикл так же возможен.
ЗЗЫ переключился на icc - тот генерит цикл в обоих случаях.
bormand 23.06.2016 21:58 # +3
guest 22.07.2016 11:38 # 0
што
Soul_re@ver 22.07.2016 11:46 # +3
Например:
Так как инт переполняться не может, условие всегда положительное, то есть цикл эквивалентен
Так как бесконечные циклы — UB, компилятор имеет право выкинуть его нахуй.
В результате вместо вектора наполненного числами [0, INT_MAX), можно получить bad_alloc, либо нихуя. А также ещё пару сотен весёлых случаев.
Soul_re@ver 22.07.2016 12:08 # +2
К примеру с size_t, переполнение беззнаковых отлично определено. И size() == 0 может быть true в двух случаях: если сравнение провалилось в первый же раз, или если нод настолько много, что size_t переполнилось (возможно неоднократно) и вернулось к 0. Поэтому компилятор не выкидывает цикл.
В случае с int, вариант всего один: если первое сравнение провалилось. Так как большинство компьютеров использует дополнительный код, то физически переменная может переполнится и дойти опять до нуля, но с точки зрения языка, это произойдёт только в случае наступления UB, а компилятор имеет право такие случаи игнорировать.
bormand 23.06.2016 22:03 # +3
https://godbolt.org/g/lAi87k
Да, походу он реально пытается не потерять бесконечный цикл.
bormand 23.06.2016 22:25 # 0
Dummy00001 23.06.2016 23:17 # +1
3_dar 23.06.2016 22:05 # 0
bormand 23.06.2016 22:05 # 0
3_dar 23.06.2016 22:08 # 0
Тем более size не сохранять это вообще тупо
roman-kashitsyn 23.06.2016 14:32 # +1
defecate-plusplus 23.06.2016 14:57 # 0
Dummy00001 23.06.2016 16:07 # +1
3_dar 23.06.2016 15:54 # +6
нет, мы делаем vec.size() === 0
inkanus-gray 23.06.2016 16:11 # +4
Steve_Brown 23.06.2016 17:30 # +6