C++ 具名要求:老式输入迭代器 (LegacyInputIterator)
老式输入迭代器 (LegacyInputIterator) 是能从所指向元素进行读取的老式迭代器 (LegacyIterator) 。老式输入迭代器 (LegacyInputIterator) 只会保证单趟算法的有效性:一旦自增老式输入迭代器 (LegacyInputIterator) i,那么所有在它之前的值的副本都可能会失效。
要求
如果满足下列条件,那么类型 It
满足老式输入迭代器 (LegacyInputIterator)
- 类型
It
满足老式迭代器 (LegacyIterator) - 类型
It
满足可相等比较 (EqualityComparable)
并且,给定
-
i
和j
,为 It 或 const It 类型的值 -
reference
,为 std::iterator_traits<It>::reference 所代表的类型 -
value_type
,为 std::iterator_traits<It>::value_type 所代表的类型
那么下列表达式必须合法且拥有它指定的效果
表达式 | 返回类型 | 等价表达式 | 注解 |
---|---|---|---|
i != j | 可按语境转换到 bool | !(i == j) | 前条件:(i, j) 在 == 的定义域中。 |
*i | reference,可转换到 value_type | 如果 i == j 与 (i, j) 在 == 的定义域中,那么这等价于 *j。 |
前条件:i 可解引用。 表达式 (void)*i, *i 等价于 *i。 |
i->m | (*i).m | 前条件:i 可解引用。 | |
++i | It& |
前条件:i 可解引用 后条件:i 可解引用或 i 是末尾后迭代器。 后条件:不再要求任何 i 的先前值的副本是可解引用的,或在 == 的定义域内。 | |
(void)i++ | (void)++i | ||
*i++ | 可转换到 value_type | value_type x = *i; ++i; |
注解
“在 ==
的定义域内”的意思是,两个迭代器值之间定义了相等比较。对于输入迭代器,相等比较不需要对所有值定义,且 ==
的定义域中的值的集合可能随时间而改变。
对于并非同时为老式向前迭代器 (LegacyForwardIterator) 的输入迭代器,其 reference 类型不必是引用类型:解引用输入迭代器可以返回一个代理对象,或以值返回 value_type 本身(如 std::istreambuf_iterator 的情况)。
概念为了定义 std::iterator_traits,定义了以下仅用于阐释的概念:
其中仅用于阐释的概念 |
(C++20 起) |
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 98 | C++98 | *i++ 的返回类型是 value_type | 可以是任意可转换到 value_type 的类型 |
参阅
(C++20) |
指定类型为输入迭代器,即可读取其所引用的值,且可前/后自增 (概念) |
迭代器库 | 提供迭代器的定义、迭代器表征、适配器及工具函数 |