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 > 表示:当特化 std:: iterator_traits < I > 由主模板生成时为 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
。
(即假定 std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: random_access_iterator_tag > 为 true 。) - 否则, /*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
为连续迭代器,指向内存中连续存储的元素
(概念) |