命名空间
变体
操作

C++ 命名要求: 旧式双向迭代器

来自 cppreference.cn
 
 
C++ 命名要求
 

旧式双向迭代器旧式前向迭代器,它可以在两个方向上移动(即,递增和递减)。

如果 旧式双向迭代器 it 源自 容器,则 itvalue_type 与容器的相同,因此解引用 (*it) 会获得容器的 value_type

目录

[编辑] 要求

如果类型 It 满足 旧式双向迭代器 的要求,则:

并且,给定

以下表达式必须有效,并具有其指定的效果

表达式 返回 等效表达式 注释
--a It& 前提条件
  • a 是可递减的(存在这样的 b 使得 a == ++b

后置条件

  • a可解引用的
  • --(++a) == a
  • 如果 --a == --ba == b
  • a--a 指代同一个迭代器对象
a-- 可转换为 const It& It temp = a;

--a;

return temp;
*a-- reference

可变旧式双向迭代器旧式双向迭代器,它还满足 旧式输出迭代器 的要求。

[编辑] 注释

begin 迭代器不可递减,如果计算 --container.begin(),则行为未定义。

双向迭代器不必是可解引用的才能是可递减的(特别是,end 迭代器不可解引用但可递减)。

概念

对于 std::iterator_traits 的定义,定义了以下仅用于说明的概念。

template<class I>

concept __LegacyBidirectionalIterator =
    __LegacyForwardIterator<I> && requires(I i)
    {
        {  --i } -> std::same_as<I&>;
        {  i-- } -> std::convertible_to<const I&>;
        { *i-- } -> std::same_as<std::iter_reference_t<I>>;

    };

其中,仅用于说明的概念 __LegacyForwardIterator旧式前向迭代器 中描述。

(自 C++20 起)

[编辑] 缺陷报告

以下行为变更缺陷报告已追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
LWG 299
(N3066)
C++98 *a-- 的返回类型
需要可转换为 T
将返回类型更改为 reference[1]
类型更改为 reference[1]
LWG 383 C++98 b 需要在 --a 之后可解引用 改为 a 需要可解引用
LWG 1212
(N3066)
C++98 *a-- 的返回类型与
“旧式前向迭代器” 要求的 *a++ 的返回类型不匹配
将返回类型更改为 reference[1]
类型更改为 reference
  1. 此问题最初由 N2758(迭代器概念)解决,但后来从 C++ 标准中删除。

[编辑] 参见

指定 forward_iterator 是一个双向迭代器,支持向后移动
(concept) [编辑]
迭代器库 提供迭代器、迭代器特征、适配器和实用函数的定义