std::experimental::ranges::advance
來自 cppreference.com
< cpp | experimental | ranges
定義於標頭檔案 <experimental/ranges/iterator> |
||
namespace { constexpr /* 未指定 */ advance = /* 未指定 */; |
(ranges TS) (定製點物件) |
|
呼叫簽名 (Call signature) |
||
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 的起始位置到結束位置的距離,如果結束位置在起始位置之前,則為負數。[編輯] 示例
本節不完整 原因:無示例 |
[編輯] 參閱
按給定距離前進迭代器 (函式模板) | |
返回迭代器與哨兵之間,或範圍的起始與結束之間的距離 (函式模板) | |
遞增迭代器 (函式模板) | |
遞減迭代器 (函式模板) |