Namespaces
Variants

std:: random_access_iterator

From cppreference.net
Iterator library
Iterator concepts
random_access_iterator
(C++20)


Iterator primitives
Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
定义于头文件 <iterator>
template < class I >

concept random_access_iterator =
std:: bidirectional_iterator < I > &&
std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: random_access_iterator_tag > &&
std:: totally_ordered < I > &&
std:: sized_sentinel_for < I, I > &&
requires ( I i, const I j, const std:: iter_difference_t < I > n ) {
{ i + = n } - > std:: same_as < I & > ;
{ j + n } - > std:: same_as < I > ;
{ n + j } - > std:: same_as < I > ;
{ i - = n } - > std:: same_as < I & > ;
{ j - n } - > std:: same_as < I > ;
{ j [ n ] } - > std:: same_as < std:: iter_reference_t < I >> ;

} ;
(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);
}

参见

指定 forward_iterator 为双向迭代器,支持向后移动
(概念)
指定 random_access_iterator 为连续迭代器,指向内存中连续存储的元素
(概念)