哪些STL算法可以安全地与单通道输入迭代器一起使用?

时间:2016-02-01 22:15:45

标签: c++ stl iterator language-lawyer

在符合标准的STL实现中,哪种或哪种STL算法可以安全使用?

换句话说:标准要求哪种或哪种STL算法是单通的?

如果详尽的清单太长,那么识别那些安全的方法也是可以的。

1 个答案:

答案 0 :(得分:16)

InputIteratorOutputIterator进行操作的算法可能只需通过一次通过它们操作的范围即可。

来自cppreference 1

InputIterators上:

  

InputIterator是一个可以从指向元素读取的迭代器。 InputIterators仅保证单通道算法的有效性:一旦InputIterator i递增,其先前值的所有副本都可能无效。

OutputIterators

  

通过输出迭代器的相同值进行赋值只发生一次:输出迭代器上的算法必须是单遍算法。

这是包含InputIteratorOutputIterator参数的算法列表:

在C ++ 17中添加:

有趣的是,此列表中有三个算法,人们可能会期望:max_elementmin_elementminmax_element是查找最大值的标准算法,最小值以及范围的最小值和最大值。人们可能希望它们只在一个时间内迭代它们给定的范围,因此需要InputIterator个参数。相反,它们需要ForwardIterator个参数,因为它们不是返回所选元素的,而是返回一个迭代器。由于这违反了InputIterator的单次传递要求,因此这些算法自然会留下ForwardIterator

1。标准(n4140草案)对两个计数都支持cppreference。

§24.2.3[input.iterators]指出在++r之后r是输入迭代器,“不再需要r的先前值的任何副本可解除引用或属于==“

的范围 表达式*r = o*r++ = o

§24.2.4[output.iterators]状态“在此操作之后,r不需要是可解除引用的。” 功能

这两个部分都包含一些注释,提到有问题的迭代器对于单遍范围是安全的,声明“算法on(输入|输出)迭代器不应该尝试两次通过同一个迭代器。它们应该是单个的通过算法。“当然,笔记没有约束力。