为什么std :: max_element需要ForwardIterator?

时间:2012-09-17 02:04:08

标签: c++ stl iterator max stl-algorithm

C ++标准库的max_element算法要求将迭代器作为模型ForwardIterator的输入传递。

我的理解是ForwardIterator通过指定您可以使用InputIterator多次迭代相同范围来优化ForwardIterator。因此,多遍算法需要ForwardIterator s。

但是,max_element不是多遍算法 - 只需迭代一次范围就可以确定其最大元素。那么为什么max_element需要ForwardIterator的其他功能?

1 个答案:

答案 0 :(得分:18)

std::max_element返回最大元素的迭代器。如果提供单个通过范围,则该迭代器将不再有效,因为算法必须对该范围执行完整传递。

在单个传递范围内,您无法将可用的迭代器保留为先前的值。这是由于标准表107中给出++r的后置条件:

  

发布:以前r值的任何副本都不再需要可解除引用或位于==的域中。

基本上,单个通过范围是一个“消失”的范围,当你通过它时,std::max_element需要一个固定的范围,以便将迭代器返回到(可能)它的中间位置。 / p>

可以编写一个算法来计算返回实际最大值而不是迭代器的最大值,但这需要值可以复制以便按值返回。 Movable是不够的,因为移动会阻止使用const迭代器。并且通过引用返回也不是一个选项,因为这意味着范围实际上停留在。