名稱空間
變體
操作

std::random_access_iterator

來自 cppreference.com
 
 
迭代器庫
迭代器概念
random_access_iterator
(C++20)


迭代器原語
演算法概念與工具
間接可呼叫概念
常用演算法要求
(C++20)
(C++20)
(C++20)
工具
(C++20)
迭代器介面卡
範圍訪問
(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> 表示 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> 不表示型別,並導致替換失敗。

[編輯] 語義要求

ab 為型別 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)
  • 對於任意兩個正整數 xy,如果 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 是一個連續迭代器,引用記憶體中連續的元素
(概念) [編輯]