std:: bidirectional_iterator
|
定义于头文件
<iterator>
|
||
|
template
<
class
I
>
concept bidirectional_iterator
=
|
(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>);
参见
|
(C++20)
|
指定
input_iterator
为前向迭代器,支持相等比较和多趟遍历
(概念) |
|
(C++20)
|
指定
bidirectional_iterator
为随机访问迭代器,支持常数时间推进和下标访问
(概念) |