Подтвердить что ты не робот

Какая разница между std:: advance и std:: next?

Есть ли более чем заблаговременные отклонения, принимающие отрицательные числа?

4b9b3361

Ответ 1

std::advance

  • изменяет свой аргумент
  • ничего не возвращает
  • работает на итераторах ввода или лучше (или двунаправленных итераторах, если дано отрицательное расстояние)

std::next

  • оставляет свой аргумент немодифицированным
  • возвращает копию аргумента, расширенную на указанную сумму
  • работает на итераторах вперед или лучше (или двунаправленных итераторах, если дано отрицательное расстояние))

Ответ 2

Возможно, самая большая практическая разница заключается в том, что std::next() доступен только на С++ 11.

std::next() будет продвигаться по одному по умолчанию, тогда как std::advance() требуется расстояние.

И тогда есть возвращаемые значения:

std::next() принимает отрицательные числа точно так же, как std::advance, и в этом случае требует, чтобы итератор был двунаправленным. std::prev() будет более читаемым, когда намерение будет специально двигаться назад.

Ответ 3

станд:: авансовый

Функция advance() увеличивает позицию итератора, переданного в качестве аргумента. Таким образом, функция позволяет итератору двигаться вперед (или назад) более чем на один элемент:

#include <iterator>
void advance (InputIterator& pos, Dist n)
  • Позволяет вводить итератор ввода шаг n элементов вперед (или назад).
  • Для итераторов с двунаправленным и случайным доступом n может быть отрицательным для перехода назад.
  • Dist - тип шаблона. Обычно он должен быть интегральным типом, так как операции, такие как <, ++, - и сравнения с 0, называется.
  • Обратите внимание, что advance() не проверяет, пересекает ли он конец() последовательности (он не может проверить, потому что итераторы вообще не знают контейнеры, на которых они работают). Таким образом, вызов этой функции может приводят к поведению undefined, потому что вызов оператора ++ для завершения последовательности не определено.

std:: nextstd::prev new в С++ 11)

#include <iterator>
ForwardIterator next (ForwardIterator pos)
ForwardIterator next (ForwardIterator pos, Dist n)
  • Устанавливает позицию, которую должен был бы иметь передний итератор pos, если был перемещен вперед 1 или n позиций.
  • Для итераторов с двунаправленным и случайным доступом n может быть отрицательным, чтобы получить предыдущие ositions.
  • Dist - это тип std:: iterator_traits:: difference_type.
  • Вызов вперед (pos, n) для внутреннего временного объекта.
  • Обратите внимание, что next() не проверяет, пересекает ли он конец() последовательности. Таким образом, до вызывающего абонента следует убедиться, что результат действительный.

укажите The C++ Standard Library Second Edition

Ответ 4

Они почти одинаковы, за исключением того, что std::next возвращает копию, а std::advance изменяет свой аргумент. Обратите внимание, что для стандарта требуется std::next вести себя как std::advance:

24.4.4 Операции итератора [iterator.operations]

template <class InputIterator, class Distance>
void advance(InputIterator& i [remark: reference], Distance n);

2. Требуется: n должно быть отрицательным только для итераторов двунаправленного и произвольного доступа
3. Эффекты: Приращения (или декременты для отрицательного n) ссылки итератора я на n.
[...]

template <class ForwardIterator>
ForwardIterator next(ForwardIterator x, [remark: copy]
     typename std::iterator_traits<ForwardIterator>::difference_type n = 1);

6. Эффекты: эквивалентны advance(x, n); return x;

Обратите внимание, что оба они поддерживают отрицательные значения, если итератором является итератор ввода. Также обратите внимание, что std::next требует, чтобы итератор отвечал условиям ForwardIterator, а std::advance нужен только входной итератор (если вы не используете отрицательные расстояния).