Namespaces
Variants

std:: bidirectional_iterator

From cppreference.net
Iterator library
Iterator concepts
bidirectional_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 bidirectional_iterator =
std:: forward_iterator < I > &&
std:: derived_from < /*ITER_CONCEPT*/ < I > , std:: bidirectional_iterator_tag > &&
requires ( I i ) {
{ -- i } - > std:: same_as < I & > ;
{ i -- } - > std:: same_as < I > ;

} ;
(C++20以降)

bidirectional_iterator の概念は、 forward_iterator を拡張し、イテレータを後方に移動する機能を追加したものです。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の専門用語(Iterator concept determination、Semantic requirements、Equality preservation、Notes、Example、See also)は原文のまま保持しました - HTMLタグ、属性、クラス名、ID、リンク先は一切変更していません - 数値や書式設定は完全に保持されています

イテレータコンセプトの決定

この概念の定義は、説明専用のエイリアステンプレート /*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:: bidirectional_iterator_tag > true と仮定される。)
  • それ以外の場合、 /*ITER_CONCEPT*/ < I > は型を表さず、置換失敗となる。

セマンティック要件

双方向イテレータ r は、ある s が存在して ++ s == r が成り立つ場合にのみ、 デクリメント可能 であると言います。

std :: bidirectional_iterator < I > は、それが包含する全てのコンセプトがモデル化されている場合にのみモデル化され、型 I の2つのオブジェクト a b が与えられたとき:

  • a がデクリメント可能であれば、 a は式 -- a および a -- の定義域に含まれる。
  • 前置デクリメントは被演算子を指す左辺値を返す: std:: addressof ( -- a ) == std:: addressof ( a )
  • 後置デクリメントは被演算子の変更前の値を返す:もし bool ( a == b ) が真であれば、 bool ( a -- == b ) も真となる。
  • 後置デクリメントと前置デクリメントは被演算子に対して同一の変更を適用する:もし bool ( a == b ) が真であれば、 a -- -- b の両方を評価した後でも、 bool ( a == b ) は依然として真となる。
  • インクリメントとデクリメントは互いに逆操作である:
  • a がインクリメント可能であり、かつ bool ( a == b ) が成り立つ場合、 bool ( -- ( ++ a ) == b ) が成り立つ。
  • a がデクリメント可能であり、かつ bool ( a == b ) が成り立つ場合、 bool ( ++ ( -- a ) == b ) が成り立つ。

等価性保存

標準ライブラリコンセプトの requires expressions で宣言される式は、 equality-preserving であることが要求されます(特に明記されている場合を除く)。

注記

LegacyBidirectionalIterator の要件とは異なり、 bidirectional_iterator コンセプトは間接参照が左辺値を返すことを要求しません。

最小限の双方向イテレータ。

#include <cstddef>
#include <iterator>
class SimpleBidiIterator
{
public:
    using difference_type = std::ptrdiff_t;
    using value_type = int;
    SimpleBidiIterator();
    SimpleBidiIterator(const SimpleBidiIterator&);
    SimpleBidiIterator& operator=(const SimpleBidiIterator&);
    int operator*() const;
    SimpleBidiIterator& operator++();
    SimpleBidiIterator operator++(int)
    {
        auto tmp = *this;
        ++*this;
        return tmp;
    }
    SimpleBidiIterator& operator--();
    SimpleBidiIterator operator--(int)
    {
        auto tmp = *this;
        --*this;
        return tmp;
    }
    bool operator==(const SimpleBidiIterator&) const;
};
static_assert(std::bidirectional_iterator<SimpleBidiIterator>);

関連項目

input_iterator が前方イテレータであることを指定し、等値比較とマルチパスをサポートする
(コンセプト)
bidirectional_iterator がランダムアクセスイテレータであることを指定し、定数時間での前進と添字アクセスをサポートする
(コンセプト)