名前空間
変種
操作

std::bidirectional_iterator

From cppreference.com
 
 
イテレータライブラリ
イテレータのコンセプト
bidirectional_iterator
(C++20)


イテレータのプリミティブ
アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
Rangeアクセス
(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 を拡張します。

目次

[編集] イテレータコンセプトの決定

このコンセプトの定義は、展示専用のエイリアステンプレート /*ITER_CONCEPT*/ を介して指定されます。

/*ITER_CONCEPT*/<I> を決定するために、特殊化 std::iterator_traits<I> がプライマリテンプレートから生成されている場合は ITER_TRAITS<I>I とし、それ以外の場合は ITER_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> は型を表さず、置換失敗となります。

[編集] 意味要件

双方向イテレータ r は、ある s が存在して ++s == r となるとき、デクリメント可能であると言います。

std::bidirectional_iterator<I> は、それが包含するすべてのコンセプトがモデル化されており、かつ型 I の 2 つのオブジェクト ab が与えられている場合にのみモデル化されます。

  • 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で宣言された式は、(特に明記されていない限り)等価性保持である必要があります。

[編集] 注記

LegacyBidirectionalIterator 要件とは異なり、bidirectional_iterator コンセプトは、デリファレンスが左辺値を返すことを要求しません。

[編集]

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

#include <cstddef>
#include <iterator>
 
struct SimpleBidiIterator
{
    using difference_type = std::ptrdiff_t;
    using value_type = int;
 
    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 が、等価比較とマルチパスをサポートする前方イテレータであることを規定する
(コンセプト) [編集]
定数時間での前進と添字アクセスをサポートするランダムアクセス イテレータであることを指定します。
(コンセプト) [編集]
English 日本語 中文(简体) 中文(繁體)