为什么std :: max_element需要ForwardIterator?

HC4*_*ica 12 c++ iterator stl max stl-algorithm

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

我的理解是通过指定您可以使用a 多次迭代相同的范围来ForwardIterator提炼.因此,多遍算法需要s.InputIteratorForwardIteratorForwardIterator

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

R. *_*des 18

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

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

post:r不再要求任何前一个值的副本可以解除引用或属于==.

基本上,单个通过范围是一个"消失"的范围,当你通过它时,std::max_element需要一个范围,以便将迭代器返回到(可能)它的中间.

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