12

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

我的理解是,通过指定您可以使用 a在同一范围内多次迭代来进行ForwardIterator细化。因此,多遍算法需要s。InputIteratorForwardIteratorForwardIterator

但是,max_element它不是多遍算法 - 在一个范围内迭代一次以确定其最大元素就足够了。那么为什么max_element需要额外的能力ForwardIterator呢?

4

1 回答 1

19

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

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

post: 之前的值的任何副本r都不再需要是可解引用的或在 的域中==

基本上,单次通过范围是在您通过它时“消失”的范围,并且std::max_element需要一个持续存在的范围以便将迭代器返回到(可能)它的中间。

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

于 2012-09-17T02:07:31.240 回答