GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • cpprefjp - C++日本語リファレンス
  • GitHub Project

This view

  • Original page
  • New address

GeezerVison is showing cpprefjp.github.io — std::random_access_iterator - cpprefjp C++日本語リファレンス

  1. リファレンス
  2. iterator
  3. random_access_iterator

最終更新日時: 2026年09月19日 21時31分51秒 (JST)
rotarymars が更新

履歴 編集

concept
<iterator>

std::random_access_iterator(C++20)

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

概要

random_access_iteratorは、イテレータ型Iがランダムアクセスイテレータであることを表すコンセプトである。

random_access_iteratorとなるイテレータは、双方向イテレータであり、+= + -= -による定数時間での進行と、-による定数時間での距離の計算が可能である。

モデル

iter_difference_t<I>の示す型D、Dの値n、型Iの有効なイテレータaと++aをn回適用したイテレータbについて次の条件を満たす場合に限って、型Iはrandom_access_iteratorのモデルである。

  • (a += n)はbと等値(equal)
  • addressof(a += n)はaddressof(a)と等値
    • +=は*thisを返す
  • (a + n)は(a += n)と等値
  • Dの2つの正の値x, yについて(a + D(x + y))が有効ならば、(a + D(x + y))は((a + x) + y)と等値
    • 結合則
  • (a + D(0))はaと等値
  • (a + D(n - 1))が有効ならば、(a + n)は[](I c){ return ++c; }(a + D(n - 1))と等値
  • (b += D(-n))はaと等値
  • (b -= n)はaと等値
  • addressof(b -= n)はaddressof(b)と等値
    • -=は*thisを返す
  • (b - n)は(b -= n)と等値
  • bが間接参照可能ならば、a[n]は有効であり*bと等値
  • bool(a <= b) == true

例

#include <iostream>
#include <concepts>
#include <iterator>
#include <vector>
#include <forward_list>
#include <list>

template<std::random_access_iterator I>
void f(const char* name) {
  std::cout << name << " is random_access_iterator" << std::endl;
}

template<typename I>
void f(const char* name) {
  std::cout << name << " is not random_access_iterator" << std::endl;
}

struct sample_random_access_iterator {
  friend auto operator++(sample_random_access_iterator&) -> sample_random_access_iterator&;
  friend auto operator++(sample_random_access_iterator&, int) -> sample_random_access_iterator;

  friend auto operator--(sample_random_access_iterator&) -> sample_random_access_iterator&;
  friend auto operator--(sample_random_access_iterator&, int) -> sample_random_access_iterator;

  friend auto operator+(const sample_random_access_iterator&, int) -> sample_random_access_iterator;
  friend auto operator+(int, const sample_random_access_iterator&) -> sample_random_access_iterator;
  friend auto operator+=(sample_random_access_iterator&, int) -> sample_random_access_iterator&;
  friend auto operator-(const sample_random_access_iterator&, int) -> sample_random_access_iterator;
  friend auto operator-=(sample_random_access_iterator&, int) -> sample_random_access_iterator&;

  friend auto operator-(const sample_random_access_iterator&, const sample_random_access_iterator&) -> int;

  friend auto operator*(const sample_random_access_iterator&) -> int&;
  auto operator[](int) const -> int&;

  friend std::strong_ordering operator<=>(const sample_random_access_iterator&, const sample_random_access_iterator&);
  friend bool operator==(const sample_random_access_iterator&, const sample_random_access_iterator&);

  using difference_type = int;
  using value_type = int;
  using iterator_category = std::random_access_iterator_tag;
};


int main() {
  f<int*>("int*");
  f<const int*>("const int*");
  f<std::vector<int>::iterator>("std::vector<int>::iterator");
  f<sample_random_access_iterator>("sample_random_access_iterator");

  std::cout << "\n";
  f<int* const>("int* const");
  f<std::forward_list<int>::iterator>("std::forward_list<int>::iterator");
  f<std::list<int>::iterator>("std::list<int>::iterator");
  f<std::istream_iterator<double>>("std::istream_iterator<double>");
  f<std::ostream_iterator<double>>("std::ostream_iterator<double>");
}

出力

int* is random_access_iterator
const int* is random_access_iterator
std::vector<int>::iterator is random_access_iterator
sample_random_access_iterator is random_access_iterator

int* const is not random_access_iterator
std::forward_list<int>::iterator is not random_access_iterator
std::list<int>::iterator is not random_access_iterator
std::istream_iterator<double> is not random_access_iterator
std::ostream_iterator<double> is not random_access_iterator

バージョン

言語

  • C++20

処理系

  • Clang: 13.0.1 ✅
  • GCC: 10.1 ✅
  • Visual C++: 2019 Update 6 ✅

関連項目

  • C++20 コンセプト

参照

  • P0896R4 The One Ranges Proposal (was Merging the Ranges TS)
  • LWG Issue 3277. Pre-increment on prvalues is not a requirement of weakly_incrementable
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.