Re[17]: Откуда эта лютая любовь к знаковым целым?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.05.20 09:25
Оценка: +1
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>А я как бы и не агитирую за это как за самое универсальное и обобщённое решение.

EP>Моя позиция в том, что лучше иметь разные варианты решений в своём инструментарии, особенно если у них есть уникальные плюсы, а не слепо отвергать их из-за каких субъективных предрассудков.

Эти "субъективные предрассудки" превращаются в объективные, когда начинаешь смотреть, как воспринимает такой код не только тот, кто всю жизнь "в системе", как я, а и, например, типовой юниор, часто к тому же перешедший с какого-то соседнего языка.
Увы, есть легко понимаемые приёмы, а есть — с трудом. Вот пост-декремент и пост-инкремент (со взятием значения, а не просто i++ в третьей части заголовка for) это как раз, насколько я вижу по крайней мере по своим коллегам, не очень легко понимаемый вариант.
Поэтому я сразу и начинаю анализировать в эту сторону.

EP>За всякими хаками частенько стоит набор аксиом, концепций, теорем — и то что выглядит на первый взгляд как хак, на самом деле имеет под собой вполне строгую математику


Имеет, да. Но читаешь всё равно шаблонами. И шаблон типа for i in closed_range(n-1, 0, -1) будет читаться проще всегда, чем while(n--).

EP>Ваше благородие, соизвольте заглянуть в ядро Linux следующим grep'ом: grep -r 'while\s*(\s*[:alnum:]_]*\s*--\s*).*[^;]'


Ну я больше имел в виду варианты типа (for(...;i-->0;...). Если это все случаи, то их мало и я на них таки не натыкался. Ядро таки огромное, 1148 это копейки, можно ни разу не встретить. Но учту.

EP>>>Идиома, кстати, применима и к итераторам — у которых может даже и не быть operator<

N>>От замены в аналоге "i-->1" на "i--!=1" теряется только визуальная красота стрелки.
EP>А я не об этом. Я о том что вот этот вариант: for (int i=n-1; i>=0; --i) на итераторы не переносится в общем случае, из-за отсутствия отношения порядка и one-before-last. А вариант while(it-- != first) — работает, потому что requires более общие concepts. Вот такой вот "хак".

Эээ
вы вообще-то не имеете права декрементировать итератор, равный begin() или rbegin(). Может случиться что угодно.
Или у вас first это не begin? Тогда я не понимаю.

N>>А именно для итераторов в C++ давно придуманы rbegin и rend,


EP>Спасибо кэп, а то ж я не знал.


Иногда очевидности нужны для введения в развитие мысли, как в данном случае. Так что прошу не ёрничать попусту.
(Тем более что вы пытаетесь от begin идти назад — так что, похоже, тут и не кэпство?)

EP>О том и речь, именно поэтому прямое итерирование вниз может быть предпочительней стандартного reverse_iterator — такак как без лишних передёргиваний. Если нужно часто — реализуй в виде ФВП.


Оптимизатор всё равно для типовых случаев вроде плоского массива всё это заоптимизирует.
А через ФВП всё равно получится менее удобно, чем при поддержке foreach самим компилятором.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.