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 的基础上进行细化,增加了向后移动迭代器的能力。

目录

迭代器概念确定

此概念的定义通过仅用于阐述的别名模板 /*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 > 不表示任何类型并导致替换失败。

语义要求

当且仅当存在某个 s 使得 ++ s == r 成立时,双向迭代器 r 被称为 可递减 的。

std :: bidirectional_iterator < I > 仅在它所包含的所有概念都被建模时才被建模,且给定两个类型为 I 的对象 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 表达式 中声明的表达式必须满足 等值保持 特性(除非另有说明)。

注释

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 为随机访问迭代器,支持常数时间推进和下标访问
(概念)