为什么std::max_element需要ForwardIterator



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

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

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

std::max_element将迭代器返回到最大元素。如果您提供了一个单遍范围,那么迭代器将不再有效,因为算法必须对该范围执行全遍。

在单次传递范围内,不能将可用迭代器保持为以前的值。这是由于标准中表107中给出的++r的后条件:

post:r的前一个值的任何副本都不再需要是可取消引用的或在==的域中。

基本上,单程范围是一个在通过时"消失"的范围,而std::max_element需要一个保持不变的范围,以便将迭代器返回(可能)到它的中间。

可以编写一个算法来计算返回实际最大值的最大值,而不是迭代器,但这需要值是可复制的,才能按值返回。仅仅移动是不够的,因为移动会阻止使用常量迭代器。通过引用返回也不是一种选择,因为这意味着范围实际上一直保持不变。

相关内容

  • 没有找到相关文章

最新更新