C ++标准库的max_element
算法要求将迭代器作为模型ForwardIterator
的输入传递。
我的理解是ForwardIterator
通过指定您可以使用InputIterator
多次迭代相同范围来优化ForwardIterator
。因此,多遍算法需要ForwardIterator
s。
但是,max_element
不是多遍算法 - 只需迭代一次范围就可以确定其最大元素。那么为什么max_element
需要ForwardIterator
的其他功能?
答案 0 :(得分:18)
std::max_element
返回最大元素的迭代器。如果提供单个通过范围,则该迭代器将不再有效,因为算法必须对该范围执行完整传递。
在单个传递范围内,您无法将可用的迭代器保留为先前的值。这是由于标准表107中给出++r
的后置条件:
发布:以前
r
值的任何副本都不再需要可解除引用或位于==
的域中。
基本上,单个通过范围是一个“消失”的范围,当你通过它时,std::max_element
需要一个固定的范围,以便将迭代器返回到(可能)它的中间位置。 / p>
可以编写一个算法来计算返回实际最大值而不是迭代器的最大值,但这需要值可以复制以便按值返回。 Movable是不够的,因为移动会阻止使用const迭代器。并且通过引用返回也不是一个选项,因为这意味着范围实际上停留在。