75

我正在尝试使用std::min_elementstd::max_element返回双精度向量中的最小和最大元素。我的编译器不喜欢我目前尝试使用它们的方式,而且我不理解错误消息。我当然可以编写自己的程序来找到最小值和最大值,但我想了解如何使用这些函数。

#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char** argv) {

    double cLower, cUpper;
    vector<double> C;

    // Code to insert values in C is not shown here

    cLower = min_element(C.begin(), C.end());
    cUpper = max_element(C.begin(), C.end());

    return 0;
}

这是编译器错误:

../MIXD.cpp:84: error: cannot convert '__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >' to 'double' in assignment
../MIXD.cpp:85: error: cannot convert '__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >' to 'double' in assignment

我究竟做错了什么?

4

3 回答 3

108

min_elementmax_element返回迭代器,而不是值。所以你需要*min_element...*max_element...

于 2012-04-15T01:05:38.323 回答
57

正如其他人所说,std::max_element()std::min_element()返回迭代器,需要取消引用才能获得

返回迭代器(而不仅仅是值)的优点是它允许您确定具有最大值(或最小值)值的容器中(第一个)元素的位置

例如(为简洁起见,使用 C++11):

#include <vector>
#include <algorithm>
#include <iostream>

int main()
{
    std::vector<double> v {1.0, 2.0, 3.0, 4.0, 5.0, 1.0, 2.0, 3.0, 4.0, 5.0};

    auto biggest = std::max_element(std::begin(v), std::end(v));
    std::cout << "Max element is " << *biggest
        << " at position " << std::distance(std::begin(v), biggest) << std::endl;

    auto smallest = std::min_element(std::begin(v), std::end(v));
    std::cout << "min element is " << *smallest
        << " at position " << std::distance(std::begin(v), smallest) << std::endl;
}

这产生:

Max element is 5 at position 4
min element is 1 at position 0

笔记:

对于大型数据集,按照上面评论中的建议使用std::minmax_element()可能会更快,但可能会给出稍微不同的结果。我上面示例的将是相同的,但“max”元素的位置将是9因为......

如果几个元素等价于最大元素,则返回最后一个此类元素的迭代器。

于 2012-04-15T02:55:22.893 回答
26

min/max_element 将迭代器返回到 min/max 元素,而不是 min/max 元素的值。您必须取消引用迭代器才能获取值并将其分配给双精度值。那是:

cLower = *min_element(C.begin(), C.end());
于 2012-04-15T01:05:52.637 回答