【问题标题】:Why does std::max_element require a ForwardIterator?为什么 std::max_element 需要 ForwardIterator?
【发布时间】:2012-09-17 02:04:08
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    发布:r 的先前值的任何副本不再需要可取消引用或位于 == 的域中。

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

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

    【讨论】:

    • 所以多次取消引用InputIterator是无效的?或者InputIterator 的副本增加后取消引用它是无效的?
    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 2016-09-07
    • 2012-07-28
    • 1970-01-01
    • 2018-07-25
    • 2011-03-16
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多