Почему std::advance не возвращает инкрементированный итератор, а инкрементирует его по ссылке на него?
Неудобно же блин, кучу телодвижений надо делать. Использую не слишком часто, поэтому ещё не привык и каждый раз плююсь.
Ну ладно, окей, может быть какие-то итераторы не копируются, или их копирование тяжёлое, а по ссылке всегда сработает оптимально. Но можно же было например сделать либо std::advance, который возвращает инкрементированное значение, и std::advance_inplace — обновляет по ссылке. Или — std::advance — работает по ссылке, а std::advance_copy — возвращает инкрементированную копию.
А я уж сам бы решил, inplace мне инкрементировать, или получать инкрементированную копию?
И да, немножко диссонанс с парной функцией std::distance, которая возвращает новое значение. Так-то понятно, что std::distance никак не может работать по ссылке, но могли бы std::advance сделать с аналогичной семантикой
Здравствуйте, Marty, Вы писали:
M>Здравствуйте!
M>Почему std::advance не возвращает инкрементированный итератор, а инкрементирует его по ссылке на него?
А зачем он нужен, если есть ++
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
M>>Почему std::advance не возвращает инкрементированный итератор, а инкрементирует его по ссылке на него?
TB>А зачем он нужен, если есть ++
Затем, вообще-то, что инкрементировать можно на произвольную дистанцию. Если тебе не нравится термин "инкрементировать на произвольную дистанцию", то можешь подискутировать об этом в описании std::advance на cppreference.com:
Increments given iterator it by n elements.
И для итераторов разных контейнеров могут быть свои версии — для вектора это просто сложение, а для списка это будет тупой ++ столько раз, сколько сказано
Здравствуйте, Marty, Вы писали:
M>Или — std::advance — работает по ссылке, а std::advance_copy — возвращает инкрементированную копию.
M>А я уж сам бы решил, inplace мне инкрементировать, или получать инкрементированную копию?
Именно так всё и работает. Одна функция меняет по месту, другая — возвращает копию. Выбирай!
Здравствуйте, watchmaker, Вы писали:
M>>А я уж сам бы решил, inplace мне инкрементировать, или получать инкрементированную копию?
W>Именно так всё и работает. Одна функция меняет по месту, другая — возвращает копию. Выбирай!
Спасибо. В ссылках в статье std::distance есть ссылка на std::advance, но нет ссылки на std::next. И я ни в каких вумных книжках по плюсам про std::next тоже не видел никогда
Здравствуйте, Marty, Вы писали:
M>Спасибо. В ссылках в статье std::distance есть ссылка на std::advance, но нет ссылки на std::next. И я ни в каких вумных книжках по плюсам про std::next тоже не видел никогда
Зато в ссылках в статье advance есть next и prev.
Возможно, причина неупоминания — в том, что advance появилось раньше next. Надо смотреть ранние версии стандартов (98 и 03).
Здравствуйте, Marty, Вы писали:
M>Здравствуйте!
M>Почему std::advance не возвращает инкрементированный итератор, а инкрементирует его по ссылке на него?
Здравствуйте, 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 сделать с аналогичной семантикой