C++标准库的max_element
算法需要迭代器作为输入传递给模型ForwardIterator
。
我的理解是,ForwardIterator
通过指定可以使用ForwardIterator
在同一范围内多次迭代来细化InputIterator
。因此,多遍算法需要ForwardIterator
s。
然而,max_element
不是一个多遍算法——在一个范围内迭代一次以确定其最大元素就足够了。那么为什么max_element
需要ForwardIterator
的额外功能呢?
std::max_element
将迭代器返回到最大元素。如果您提供了一个单遍范围,那么迭代器将不再有效,因为算法必须对该范围执行全遍。
在单次传递范围内,不能将可用迭代器保持为以前的值。这是由于标准中表107中给出的++r
的后条件:
post:
r
的前一个值的任何副本都不再需要是可取消引用的或在==
的域中。
基本上,单程范围是一个在通过时"消失"的范围,而std::max_element
需要一个保持不变的范围,以便将迭代器返回(可能)到它的中间。
可以编写一个算法来计算返回实际最大值的最大值,而不是迭代器,但这需要值是可复制的,才能按值返回。仅仅移动是不够的,因为移动会阻止使用常量迭代器。通过引用返回也不是一种选择,因为这意味着范围实际上一直保持不变。