【问题标题】:In c++11, how can I call std::max on a vector?在 c++11 中,如何在向量上调用 std::max?
【发布时间】:2013-12-12 20:55:32
【问题描述】:

我有一个vector<data>data 是我自己的宠物类型),我想找到它的最大值。

C++11 中的标准 std::max 函数似乎适用于对象集合,但它需要一个初始化列表作为其第一个参数,而不是像 vector 这样的集合:

vector<data> vd;
std::max(vd); // Compilation error
std::max({vd[0], vd[1], vd[2]}); // Works, but not ok since I don't vd.size() at compile time

我该如何解决这个问题?

【问题讨论】:

    标签: c++ c++11 std initializer-list


    【解决方案1】:

    可能用 lambda 更灵活

    vector<data> vd;
    
    auto it = max_element(vd.cbegin(), vd.cend(), [](const data& left, const data& right)
        {
        return (left < right);
        });
    

    您只需通过data::operator &lt; ()为您的类型“数据”实现比较运算符

    【讨论】:

      【解决方案2】:

      std::max 重载仅适用于编译时已知的小集合。您需要的是std::max_element(甚至是 11 之前的版本)。这会将迭代器返回到集合的最大元素(或任何迭代器范围):

      auto max_iter = std::max_element(vd.begin(), vd.end());
      // use *max_iter as maximum value (if vd wasn't empty, of course)
      

      【讨论】:

      • 看来这个答案仍然有效。 std::max 不能处理向量,只能处理 initializer_list。正是因为这样的事情,Pyhton 在快速原型制作工作中非常出色。而且我无法相信接受向量可能会对 std::max 的性能产生影响。
      猜你喜欢
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 2014-09-18
      • 2014-02-27
      • 2012-12-20
      • 2022-06-22
      相关资源
      最近更新 更多