C++标准库的max_element
算法要求将迭代器作为输入传递给ForwardIterator
模型。
我的理解是ForwardIterator
通过指定您可以使用InputIterator
在相同的范围内多次迭代来优化ForwardIterator
。因此,多遍算法需要使用ForwardIterator
。
但是,max_element
不是多遍算法-一次遍历一个范围就足以确定其最大元素就足够了。那么max_element
为什么需要ForwardIterator
的附加功能?
最佳答案
std::max_element
将迭代器返回到最大元素。如果您提供单个通过范围,则该迭代器将不再有效,因为算法必须对该范围执行完整通过。
在单遍范围内,您不能将可用的迭代器保持为先前的值。这是由于标准中表107中给出的++r
的后置条件引起的:
基本上,单次通过范围是在您通过它时“消失”的范围,而std::max_element
需要保持不变的范围,以便使迭代器返回(可能)其中间。
可以编写一种算法来计算返回实际最大值的最大值,而不是迭代器,但是这将要求这些值是可复制的,以便按值返回它。由于移动将阻止使用const迭代器,因此可移动的方法是不够的。通过引用返回也不是一种选择,因为那将意味着该范围实际上一直停留在该范围内。
关于c++ - 为什么std::max_element需要ForwardIterator?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12452356/