Namespaces
Variants

std::experimental::ranges:: advance

From cppreference.net
namespace {

constexpr /* 未指定 */ advance = /* 未指定 */ ;

}
(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 。否则,将 i 递增(若 n 为负则递减) 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 > ,则当 | n | >= | bound - i | 时等价于 ranges:: advance ( i, bound ) ,否则等价于 ranges:: advance ( i, n )
否则,将 i 递增(若 n 为负值则递减) 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 的起始位置到终止位置的距离,若终止位置位于起始位置之前则该值为负。

示例

参见

将迭代器前进指定距离
(函数模板)
返回迭代器与哨位之间的距离,或范围起始与末尾之间的距离
(函数模板)
递增迭代器
(函数模板)
递减迭代器
(函数模板)