std::advance
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.10.25 20:18
Оценка:
Здравствуйте!

Почему std::advance не возвращает инкрементированный итератор, а инкрементирует его по ссылке на него?

Неудобно же блин, кучу телодвижений надо делать. Использую не слишком часто, поэтому ещё не привык и каждый раз плююсь.

Ну ладно, окей, может быть какие-то итераторы не копируются, или их копирование тяжёлое, а по ссылке всегда сработает оптимально. Но можно же было например сделать либо std::advance, который возвращает инкрементированное значение, и std::advance_inplace — обновляет по ссылке. Или — std::advance — работает по ссылке, а std::advance_copy — возвращает инкрементированную копию.

А я уж сам бы решил, inplace мне инкрементировать, или получать инкрементированную копию?


И да, немножко диссонанс с парной функцией std::distance, которая возвращает новое значение. Так-то понятно, что std::distance никак не может работать по ссылке, но могли бы std::advance сделать с аналогичной семантикой
Маньяк Робокряк колесит по городу
Отредактировано 15.10.2025 20:21 Marty . Предыдущая версия .
Re: std::advance
От: T4r4sB Россия  
Дата: 15.10.25 20:22
Оценка: -1
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Почему std::advance не возвращает инкрементированный итератор, а инкрементирует его по ссылке на него?


А зачем он нужен, если есть ++
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: std::advance
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.10.25 20:33
Оценка:
Здравствуйте, T4r4sB, Вы писали:

M>>Почему std::advance не возвращает инкрементированный итератор, а инкрементирует его по ссылке на него?


TB>А зачем он нужен, если есть ++


Затем, вообще-то, что инкрементировать можно на произвольную дистанцию. Если тебе не нравится термин "инкрементировать на произвольную дистанцию", то можешь подискутировать об этом в описании std::advance на cppreference.com:

Increments given iterator it by n elements.


И для итераторов разных контейнеров могут быть свои версии — для вектора это просто сложение, а для списка это будет тупой ++ столько раз, сколько сказано
Маньяк Робокряк колесит по городу
std::next
От: watchmaker  
Дата: 15.10.25 20:56
Оценка: +3
Здравствуйте, Marty, Вы писали:

M>Или — std::advance — работает по ссылке, а std::advance_copy — возвращает инкрементированную копию.


M>А я уж сам бы решил, inplace мне инкрементировать, или получать инкрементированную копию?


Именно так всё и работает. Одна функция меняет по месту, другая — возвращает копию. Выбирай!
Отредактировано 15.10.2025 21:04 watchmaker . Предыдущая версия .
Re: std::next
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 15.10.25 21:17
Оценка:
Здравствуйте, watchmaker, Вы писали:

M>>А я уж сам бы решил, inplace мне инкрементировать, или получать инкрементированную копию?


W>Именно так всё и работает. Одна функция меняет по месту, другая — возвращает копию. Выбирай!


Спасибо. В ссылках в статье std::distance есть ссылка на std::advance, но нет ссылки на std::next. И я ни в каких вумных книжках по плюсам про std::next тоже не видел никогда
Маньяк Робокряк колесит по городу
Re[2]: std::next
От: Кодт Россия  
Дата: 15.10.25 23:15
Оценка:
Здравствуйте, Marty, Вы писали:

M>Спасибо. В ссылках в статье std::distance есть ссылка на std::advance, но нет ссылки на std::next. И я ни в каких вумных книжках по плюсам про std::next тоже не видел никогда


Зато в ссылках в статье advance есть next и prev.

Возможно, причина неупоминания — в том, что advance появилось раньше next. Надо смотреть ранние версии стандартов (98 и 03).
Перекуём баги на фичи!
Re: std::advance
От: rg45 СССР  
Дата: 16.10.25 06:38
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Почему std::advance не возвращает инкрементированный итератор, а инкрементирует его по ссылке на него?


Так есть же для этих целей std::prev и std::next.
--
Справедливость выше закона. А человечность выше справедливости.
Re: std::advance
От: boomer  
Дата: 16.10.25 21:18
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Почему std::advance не возвращает инкрементированный итератор, а инкрементирует его по ссылке на него?


M>Неудобно же блин, кучу телодвижений надо делать. Использую не слишком часто, поэтому ещё не привык и каждый раз плююсь.


M>Ну ладно, окей, может быть какие-то итераторы не копируются, или их копирование тяжёлое, а по ссылке всегда сработает оптимально. Но можно же было например сделать либо std::advance, который возвращает инкрементированное значение, и std::advance_inplace — обновляет по ссылке. Или — std::advance — работает по ссылке, а std::advance_copy — возвращает инкрементированную копию.


M>А я уж сам бы решил, inplace мне инкрементировать, или получать инкрементированную копию?



M>И да, немножко диссонанс с парной функцией std::distance, которая возвращает новое значение. Так-то понятно, что std::distance никак не может работать по ссылке, но могли бы std::advance сделать с аналогичной семантикой


std::next должен спасти отца русской демкоратии.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.