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

qua*_*dev 3 c++ iterator stl language-lawyer

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

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

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

jag*_*ire 16

InputIterators和OutputIterators 上运行的算法可以通过合同仅依赖于它们操作的范围内的单次通过.

从cppreference 1:

InputIterators:

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

并在OutputIterators

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


这是具有InputIterator和的参数的那些算法的列表OutputIterator:

在C++ 17中添加:

有趣的是,有三种算法没有此列表中人们所预料的:max_element,min_element并且minmax_element是标准的算法发现的最大,最小和最小和范围的最大值.人们可能期望它们只在一个时间内迭代它们给定的范围,因此需要InputIterator参数.相反,它们需要ForwardIterator参数,因为它们不是返回所选元素的,而是返回一个迭代器.由于这违反了InputIterator的单程要求,因此这些算法自然会留下一个ForwardIterator.


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

§24.2.3[input.iterators]指出后++r,其中r是输入迭代器,"不再需要r的先前值的任何副本要么是提领或是在==域"

§24.2.4[output.iterators]表示两个表达式*r = o*r++ = o"在此操作之后r不需要是可解除引用的".

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

  • 请注意,这并不意味着如果给定前向或更强的迭代器,它们就不能执行多遍. (2认同)