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::bidirectional_iterator - cpprefjp C++日本語リファレンス

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

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

履歴 編集

concept
<iterator>

std::bidirectional_iterator(C++20)

namespace std {
  template<class I>
  concept bidirectional_iterator =
    forward_iterator<I> &&
    derived_from<ITER_CONCEPT(I), bidirectional_iterator_tag> &&
    requires(I i) {
      { --i } -> same_as<I&>;
      { i-- } -> same_as<I>;
    };
}

概要

bidirectional_iteratorは、イテレータ型Iが双方向イテレータであることを表すコンセプトである。

bidirectional_iteratorとなるイテレータは、前方向イテレータであり、後方にも進むことのできるイテレータである。

要件

あるbidirectional_iteratorをrとすると、rは++q == rとなるようなイテレータqが存在する場合にのみデクリメント(--)可能である。そのようなデクリメント可能なイテレータは、--rとr--(デクリメント演算子)の定義域にある。

モデル

型Iの等しい2つのオブジェクト(同じ要素を指すイテレータ)a, bについて次の条件を満たす場合に限って、型Iはbidirectional_iteratorのモデルである。

  • a, bがデクリメント可能ならば、次の4つの条件を全て満たす
    • addressof(--a) == addressof(a)
    • bool(a-- == b)
    • a--, --bの評価の後でも、bool(a == b)はtrueとなる
    • bool(++(--a) == b)
  • a, bがインクリメント可能ならば、bool(--(++a) == b)

例

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

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

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

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

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

  friend auto operator*(const sample_bidirectional_iterator&) -> int&;

  friend bool operator==(const sample_bidirectional_iterator&, const sample_bidirectional_iterator&);

  using difference_type = int;
  using value_type = int;
  using iterator_concept = std::bidirectional_iterator_tag;
};


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

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

出力

int* is bidirectional_iterator
const int* is bidirectional_iterator
std::list<int>::iterator is bidirectional_iterator
std::vector<int>::iterator is bidirectional_iterator
sample_bidirectional_iterator is bidirectional_iterator

int* const is not bidirectional_iterator
std::forward_list<int>::iterator is not bidirectional_iterator
std::istream_iterator<double> is not bidirectional_iterator
std::ostream_iterator<double> is not bidirectional_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)
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.