Namespaces
Variants

std::experimental::ranges:: advance

From cppreference.net
Определено в заголовке <experimental/ranges/iterator>
namespace {

constexpr /* unspecified */ advance = /* unspecified */ ;

}
(ranges TS)
(объект точки кастомизации)
Сигнатура вызова
template < Iterator I >
constexpr void advance ( I & i, ranges :: difference_type_t < I > n ) ;
(1)
template < Iterator I, Sentinel < I > S >
constexpr void advance ( I & i, S bound ) ;
(2)
template < Iterator I, Sentinel < I > S >
constexpr ranges :: difference_type_t < I > advance ( I & i, ranges :: difference_type_t < I > n, S bound ) ;
(3)

Перемещает итератор i n раз, или до достижения bound в зависимости от того, что наступит раньше.

1) Если I моделирует RandomAccessIterator , эквивалентно i + = n . В противном случае инкрементирует (или декрементирует, если n отрицательно) i n раз. Поведение не определено, если n отрицательно и I не моделирует BidirectionalIterator .
2) Если Assignable < I & , S > выполняется, эквивалентно i = std :: move ( bound ) .
В противном случае, если [ i , bound ) не обозначает диапазон, поведение не определено.
В противном случае, если SizedSentinel < S, I > удовлетворено, эквивалентно ranges:: advance ( i, bound - i ) .
В противном случае увеличивает i до тех пор, пока i == bound .
3) Если SizedSentinel < S, I > удовлетворено, эквивалентно ranges:: advance ( i, bound ) если | n | >= | bound - i |, и ranges:: advance ( i, n ) в противном случае.
В противном случае увеличивает (или уменьшает, если n отрицателен) i либо n раз, либо до достижения условия i == bound , в зависимости от того, что наступит раньше.
Если n > 0 , [ i , bound ) обозначает диапазон; если n == 0 , либо [ i , bound ) , либо [ bound , i ) обозначает диапазон; если n < 0 , [ bound , i ) обозначает диапазон, I и S должны быть одного типа, и I должен моделировать BidirectionalIterator . В противном случае поведение не определено.

Содержание

Объекты точек кастомизации

Название ranges::advance обозначает объект точки кастомизации , который является функциональным объектом типа литерального Semiregular класса (обозначенного, для целей демонстрации, как AdvanceT ). Все экземпляры AdvanceT равны. Таким образом, ranges::advance можно свободно копировать, и его копии могут использоваться взаимозаменяемо.

Для заданного набора типов Args... , если std:: declval < Args > ( ) ... удовлетворяют требованиям к аргументам для ranges::advance выше, AdvanceT будет удовлетворять ranges :: Invocable < const AdvanceT, Args... > . В противном случае ни один оператор вызова функции AdvanceT не участвует в разрешении перегрузки.

В каждой единице трансляции, где определен ranges::advance , он ссылается на один и тот же экземпляр объекта точки настройки. (Это означает, что его можно свободно использовать в таких конструкциях, как встроенные функции и шаблоны функций, не нарушая правило одного определения .)

Возвращаемое значение

1,2) (нет)
3) Количество операций инкремента/декремента, не выполненных из-за достижения bound . Другими словами, n - M , где M - это расстояние от начальной позиции i до конечной позиции, и оно отрицательно, если конечная позиция находится перед начальной позицией.

Пример

Смотрите также

перемещает итератор на заданное расстояние
(шаблон функции)
возвращает расстояние между итератором и стражем, или между началом и концом диапазона
(шаблон функции)
увеличивает итератор
(шаблон функции)
уменьшает итератор
(шаблон функции)