- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
// https://github.com/telegramdesktop/tdesktop/blob/5f5770dd46491133b135a71fc2d4f92d13107ade/Telegram/SourceFiles/history.cpp#L1455
int History::countUnread(MsgId upTo) {
int result = 0;
for (auto i = blocks.cend(), e = blocks.cbegin(); i != e;) {
--i;
for (auto j = (*i)->items.cend(), en = (*i)->items.cbegin(); j != en;) {
--j;
if ((*j)->id > 0 && (*j)->id <= upTo) {
break;
} else if (!(*j)->out() && (*j)->unread() && (*j)->id > upTo) {
++result;
}
}
}
return result;
}
void History::updateShowFrom() {
if (showFrom) return;
for (auto i = blocks.cend(); i != blocks.cbegin();) {
--i;
for (auto j = (*i)->items.cend(); j != (*i)->items.cbegin();) {
--j;
if ((*j)->id > 0 && (!(*j)->out() || !showFrom)) {
if ((*j)->id >= inboxReadBefore) {
showFrom = *j;
} else {
return;
}
}
}
}
}
Нахуя такие циклы делать?
PVS Studio, CLion, ReSharper for C++... :)
Но может быть я просто не умею в олимпиаду
Чем бы дитя не тешилось, лишь бы поля в объектах не называло в духе m.mpx[3].dpx.dx... А i и j в небольших функциях - вполне терпимо.
Можно и лопатой выхватить на код ревью, хотя очевидно его просто нет
Ну и циклы... Циклы тут эпичные, видел код где вместо
Причем это методы - однострочники с условием...
Но в крестах с их RAII она, конечно, ни к чему.
ахахахахаха
неужели ради #define ?!
Это, по сути, сишный try ... finally.
Это чтоб наверняка?
а в перле был оператор goatse: ``=()=``
О да, давайте сначала проверим, равно ли некоторое говно nullptr, и вот если не равно, то тогда присвоим nullptr, а если и так равно, то и присваивать не надо, ОПТИМИЗАЦИЯ
ну может быть оно автогенерённое?
Это ближе к уебанам if (cond) return true; else return false;
Когда хуяришь быстро-быстро много строк говна, думать над мелочами особо некогда. Только привычки и остаются.
Где const?
> auto i = blocks.cend()
не осилили reverse_iterator ?
> (*j)->id <= upTo
Как так, олимпиадники упустили возможность применить бинарный поиск?
А вдруг у итерации по blocks есть побочные эффекты (типа подкачки с флешки/сервера)?
mutable же
Нахрена делать такой for() ? В цикле в for () обычно что-то уменьшают-увеличивают, ну типа:
Тут же этот i уменьшается не в for(тут) а в самом теле цикла. Зачем? Зачем делать for в котором нихрена не меняется внутри круглых скобок?
> for (int i = 14; i >= 0; i--)
а теперь замени int на uint, раз всё так просто
А что им мешало сделать например так:
for(auto i = blocks.cend() - 1
if( blocks.cend() != blocks.cbegin() )
вообще да, если уж не знать про reverse_iterator, правильнее будет какой-нибудь while использовать
Когда я вижу for(), я ожидаю что в круглых скобочках этого for() будет происходить некая хрень, меняющая то, из-за чего условие в for() должно перестать работать
И у тебя i и e вывалятся наружу, а с for'ом они были локальными для тела цикла...
З.Ы. Хотя фишка из нового стандарта вроде позволит написать как-то так:
а у нас
а мы
В общем, скучно в этом вашем ruby.
cм "для скучных"
>>по-крестовому через итераторы, п
>>через for-по-контейнеру,
см "для педантов"
>>по-функциональному через алгоритмы
ну там сверху три примерчика же
В общем руби не хуже крестов, если конечно сравнивать их по такому важному параметрку как количество ебанутых способов обойти коллекцию
Да и лямбду описать у вас всего жалкая пара способов.
А где аналог варианта с goto?
Нету в вашем руби простора для самовыражения.
Обижаешь! Это же руби, тут всего по четыре способа
>>А где аналог варианта с goto?
Держись за стул: https://rubygems.org/gems/goto
Category: Library/Evil
- указатель на функцию, как в няшной
- функторы аля класс-с-оператором-скобки
- каррирование и кобенирование через bind
- бустовая магия _1 < _2
- настоящие лямбды из нового стандарта
Каждый способ по-своему уникален.
индексация +1 за пределом области памяти вернет NULL, или туда надо явно положить NULL?
Предок-то он может и предок, то физически ведь получается тоже самое
адрес начала массива (указатель) плюс сдвиг размером с тип данных, умножить на индекс
Совсем люди позабыли об основах со своими языками высокого уровня...
правда за такое уже пиздят, конечно.
И RubyMine и RuboCop верещат на такой код
http://govnokod.ru/19105 можно даже с goto без if
Можно еще сверху все обернуть фигурными скобками, чтоб не ВЫВАЛИВАЛОСЬ
Пусть только "Java/C#/PHP - не важно, главное - популярный язык" сначала компилироваться начнет
> когда уже у программистов погорят языки и библиотеки, чтоб пожарные шланги модулей наконец унифицировали?
Специально для тебя могут унифицировать охлажденные дилдаки.
Java/C# не просто компилируемые, а дважды компилируемые. Разве этого мало?
> Специально для тебя могут унифицировать охлажденные дилдаки.
Что за питушню я читаю?
Открою страшную правду тем, кто долго сидел в интернетах, что пожарный шланг - это часть оборудования для тушения огня, а не термин с порносайта.
Ситуация в Интернете стала напоминать время, когда в начале XX века в США пожарные шланги в каждом городе были сделаны по-своему. Это приводил к тому, что пожарные из соседнего города не могли помочь в случае серьёзного пожара.
В. Соломенчук. Понятный самоучитель Интернет. Питер, 2008. с. 188
Как вообще так можно было сделать?
Время было другое, наверно не продумали всё.
Вон у нас до сих пор наличными расплачиваются, а люди будущего будут удивляться, как же не лень было нам считать сраные копейки и пердолиться со сдачей, когда достаточно было получать всё нужное сразу в холодильник или просто взять из магазина нужный товар и пойти домой, максимум - дедовским способом поднести телефон к терминалу у бабушки на улице.
и
В первом случае делается переменная e, которой присваиваем blocks.cbegin(), во втором же никакой переменной e не создается. Почему и там и там не сделать каким-нибудь одним способом? Например, если получение blocks.cbegin() это какая-то там операция, которая не может быть соптимизирована (т.е. если компилятор не может доказать, что cbegin на каждой итерации данного сраного цикла будет все тем же) то и там и там сделайте e = blocks.cbegin() хуйню