Здравствуйте, 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 самим компилятором.