std::random_access_iterator
定義於標頭檔案 <iterator> |
||
template< class I > concept random_access_iterator = |
(C++20 起) | |
概念 random_access_iterator
透過新增對 +=
, +
, -=
和 -
運算子的常數時間移動支援、使用 -
進行常數時間距離計算以及使用下標 []
進行陣列式訪問來完善 bidirectional_iterator
。
目錄 |
[編輯] 迭代器概念確定
此概念的定義透過一個僅用於說明的別名模板 /*ITER_CONCEPT*/ 指定。
為了確定 /*ITER_CONCEPT*/<I>,令 ITER_TRAITS<I> 表示 I 如果特化 std::iterator_traits<I> 是由主模板生成的,否則表示 std::iterator_traits<I>
- 如果 ITER_TRAITS<I>::iterator_concept 有效並指明一個型別,則 /*ITER_CONCEPT*/<I> 表示該型別。
- 否則,如果 ITER_TRAITS<I>::iterator_category 有效並指明一個型別,則 /*ITER_CONCEPT*/<I> 表示該型別。
- 否則,如果 std::iterator_traits<I> 是由主模板生成的,則 /*ITER_CONCEPT*/<I> 表示 std::random_access_iterator_tag。
- 否則,/*ITER_CONCEPT*/<I> 不表示型別,並導致替換失敗。
[編輯] 語義要求
令 a 和 b 為型別 I
的有效迭代器,使得 b 可以從 a 到達,並且令 n 為型別 std::iter_difference_t<I> 的值,其等於 b - a。僅當它所包含的所有概念都得到建模時,才建模 std::random_access_iterator<I>,並且
- (a += n) 等於 b。
- std::addressof(a += n) 等於 std::addressof(a)。 [1]
- (a + n) 等於 (a += n)。
- (a + n) 等於 (n + a)。
- 對於任意兩個正整數
x
和y
,如果 a + (x + y) 有效,則 a + (x + y) 等於 (a + x) + y。 - a + 0 等於 a。
- 如果 (a + (n - 1)) 有效,則 --b 等於 (a + (n - 1))。
- (b += -n) 和 (b -= n) 都等於 a。
- std::addressof(b -= n) 等於 std::addressof(b)。 [1]
- (b - n) 等於 (b -= n)。
- 如果 b 可解引用,則 a[n] 有效且等於 *b。
- bool(a <= b) 為 true。
- 每個所需操作都具有常數時間複雜度。
請注意,std::addressof 返回迭代器物件的地址,而不是迭代器指向的物件的地址。即,operator+=
和 operator-=
必須返回對 *this 的引用。
[編輯] 相等性保持
標準庫概念的 requires 表示式 中宣告的表示式需要 保持相等性(除非另有說明)。
[編輯] 隱式表示式變體
使用對某個常量左值運算元是非修改性的表示式的 requires 表示式 也需要 隱式表示式變體。
[編輯] 注意
與 LegacyRandomAccessIterator 要求不同,random_access_iterator
概念不要求解引用返回左值。
[編輯] 示例
演示透過 C++20 概念實現 std::distance 的可能實現。
#include <iterator> namespace cxx20 { template<std::input_or_output_iterator Iter> constexpr std::iter_difference_t<Iter> distance(Iter first, Iter last) { if constexpr(std::random_access_iterator<Iter>) return last - first; else { std::iter_difference_t<Iter> result{}; for (; first != last; ++first) ++result; return result; } } } int main() { static constexpr auto il = {3, 1, 4}; static_assert(std::random_access_iterator<decltype(il.begin())> && cxx20::distance(il.begin(), il.end()) == 3 && cxx20::distance(il.end(), il.begin()) == -3); }
[編輯] 參閱
(C++20) |
指定forward_iterator 是雙向迭代器,支援向後移動(概念) |
(C++20) |
指定 random_access_iterator 是一個連續迭代器,引用記憶體中連續的元素(概念) |