Форум
Компьютерные священные войны
Тема
Как правильно задавать вопросы
B
I
abc
U
X
3
X
3
H1
H2
H3
H4
H5
H6
Asm
C/C++
C#
Erlang
Haskell
IDL
Java
Lisp
MSIL
Nemerle
ObjC
OCaml
Pascal
Perl
PHP
Prolog
Python
Ruby
Rust
SQL
VB
Здравствуйте, Evgeny.Panasyuk, Вы писали: EP>Здравствуйте, netch80, Вы писали: N>>Это всё очевидно. Неочевидно сходу то, насколько скоро он это всё забудет - а если такая идиома встречается не часто, то забудет быстро. EP>Ну не запомнит юниор с первого раза, в чём трагедия? N>>>>Имеет, да. Но читаешь всё равно шаблонами. И шаблон типа for i in closed_range(n-1, 0, -1) будет читаться проще всегда, чем while(n--). EP>>>Да и что означает closed_range в данном случае? запрет на n=0? N>>Наоборот, что оба граничных значения включены в набор. EP>Ну то есть ты действительно имеешь в виду стандартное значение closed, а не какое-то своё, а значит [n-1, 0] так? EP>n=1: [0, 0] EP>n=0: [-1, 0] :???: EP>Зато смотри как стройно с [tt]while(n--)[/tt]: (n, 0] N>>Closed - оба конца включены. Open - оба конца не включены. N>>Half-open range - например, в C++ для любого контейнера begin() входит в значения, а end() - нет. В Python, аналогично, range(0, 10) это от 0 до 9 включительно (а чтобы от N до M включительно вниз, надо писать range(N, M-1, -1)). EP>Ну так в C++ он half-open, как раз для того чтобы пустые диапазоны можно было определять: [first, first). EP>Как ты пустой диапазон обозначишь на closed range? [first, first] не работает :xz: EP>На Python он тоже half-open. EP>А у тебя closed_range(x, y, -1) - это что? [x, y]? EP>>>Ну я говорю всё время про [tt]while(n--)[/tt], но можем конечно и вариант с for погрепать. Но суть от этого не меняет - применяется повсеместно. N>>Вот именно что "повсеместность" этого подхода, как оказывается, сильно однобока. EP>Что значит однобока? Само по себе итерирование вниз нужно очень редко, по моим прикидкам один к ста или даже один к тысячи по сравнению с итерированием вверх :xz: EP>>>Да, сам увидел - я это место дополнил: EP>>>Точнее one-before-last обходится переносом декремента на первую строчку тела (как уже показывали ранее в этой теме): while(it != first){--it; ...}, но концептуально то же самое. N>>Ну и снова получаем уже известную проблему: надо перед циклом начать с n+1, чтобы в цикле работать с n. Это уже второй уровень наворота идиомы (первый - формат условия продолжения с пост-декрементом). EP>Да не нужно начинать с n+1, оно уже "готовое" - итератор .end() - уже указывает на один за последним элементом. EP>То есть для стандартных [first, last) получаем: [tt]while(last != first){--last; use(*last); }[/tt], никаких преикрементов. EP>Точно также как для N элементов последний индекс начиная от 0 - N-1, поэтому не нужно делать N+1 перед циклом :xz: N>>>>Оптимизатор всё равно для типовых случаев вроде плоского массива всё это заоптимизирует. EP>>>Не всегда варианты простые. Тем не менее - прямее сразу делать оптимально по-возможности жеж. N>>Так не оптимально же, когда лишний инкремент на входе EP>Так его и нету :xz:
Теги:
Введите теги разделенные пробелами. Обрамляйте в кавычки словосочетания с пробелами внутри, например:
"Visual Studio" .NET
Имя, пароль:
Загрузить
Нравится наш сайт?
Помогите его развитию!
Отключить смайлики
Получать ответы по e-mail
Проверить правописание
Параметры проверки …