命名空间
变体
操作

C++ 命名需求: LegacyForwardIterator

来自 cppreference.cn
 
 
C++ 命名要求
基本
类型属性
全库范围




Container(容器)
容器元素
迭代器 (Iterator)
LegacyForwardIterator(传统前向迭代器)
流 I/O
格式化器
随机数
并发
Ranges(范围)
多维视图
其他

 

LegacyForwardIterator 是一种 LegacyIterator,可以从所指向的元素中读取数据。

LegacyInputIteratorLegacyOutputIterator 不同,它可以在多趟算法中使用。

如果一个 LegacyForwardIterator it 源自一个 Container,那么 it 的值类型与容器的值类型相同,因此解引用 (*it) 获取容器的值类型。

目录

[编辑] 要求

类型 定义
X 前向迭代器类型
T X值类型(即 std::iterator_traits<X>::value_type
Ref std::iterator_traits<X>::reference
定义
i, j 类型为 Xconst X 的值
r 类型为 X& 的值

如果满足以下所有条件,则 X 满足 LegacyForwardIterator

  • X 满足 LegacyInputIterator
  • X 满足 DefaultConstructible
  • 如果 X 是一个可变迭代器,则 Ref 是对 T 的引用。
  • 如果 X 是一个常量迭代器,则 Ref 是对 const T 的引用。
  • 类型 X 的对象提供多趟保证
  • 如果 ij 相等,那么 ij 要么都可以解引用,要么都不能解引用。
  • 如果 ij 都可以解引用,那么 i == j 当且仅当 *i*j 绑定到同一个对象。
  • 以下表达式必须有效并具有其指定的效果
 表达式  类型 效果
r++ 可转换为 const X&  等价于 X x = r;
++r;
return x;
*i++ Ref

[编辑] 相等域

前向迭代器的 == 是其在相同底层序列上的迭代器。

然而,值初始化的前向迭代器可以比较,并且必须与相同类型的其他值初始化迭代器比较相等。

换句话说,值初始化的前向迭代器表现得好像它们引用了同一个空序列的末尾之外的位置。

(C++14 起)

[编辑] 多趟保证

类型 X 的两个可解引用迭代器 ab 如果满足以下所有条件,则提供多趟保证

  • a == b 蕴含 ++a == ++b
  • 满足以下任何条件:
  • X 是一种指针类型。
  • 表达式 (void)++X(a), *a 等价于表达式 *a

概念

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

template<class It>

concept __LegacyForwardIterator =
    __LegacyInputIterator<It> && std::constructible_from<It> &&
    std::is_reference_v<std::iter_reference_t<It>> &&
    std::same_as<
        std::remove_cvref_t<std::iter_reference_t<It>>,
        typename std::indirectly_readable_traits<It>::value_type> &&
    requires(It it) {
        {  it++ } -> std::convertible_to<const It&>;
        { *it++ } -> std::same_as<std::iter_reference_t<It>>;

    };

其中,仅用于展示的 concept __LegacyInputIterator<T>LegacyInputIterator 中描述。

(C++20 起)

[编辑] 注意

std::forward_iterator 概念不同,LegacyForwardIterator 要求解引用返回一个引用。

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
LWG 1212
(N3066)
C++98 *i++ 的类型与
LegacyBidirectionalIterator 所要求的 *i-- 的类型不匹配
将类型
更改为 Ref
LWG 1311
(N3066)
C++98 a == b 蕴含 ++a == ++b” 单独
不提供多趟保证[1]
还要求 “a == b
蕴含 ++a != b[2]
LWG 3798 C++20 __LegacyForwardIterator 要求
std::iter_reference_t<It> 必须是左值引用类型
也允许右值
引用类型
  1. ab 使用相同底层迭代器的情况下,评估表达式 ++a == ++b 实际上会使底层容器自增两次,但结果仍然是 true
  2. 形式上还要求蕴含 ++b != a

[编辑] 另请参阅

指定input_iterator是前向迭代器,支持相等比较和多趟遍历
(concept) [编辑]
迭代器库 为迭代器、迭代器特性、适配器和实用函数提供定义