在载体上使用的std :: max_element (Using std::max_element

2019-06-23 15:26发布

我试图使用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 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

会有人请解释什么,我做错了什么?

Answer 1:

min_elementmax_element返回迭代器,而不是价值。 因此,你需要*min_element...*max_element...



Answer 2:

正如其他人所说, 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()在评论上述建议可能对大型数据集的速度更快,但可能会略有不同的结果。 我的示例中的以上将是相同的,但“最大”元素的位置将是9 ,因为......

如果几个要素等同于最大的元素,则返回迭代器到最后一个这样的元素。



Answer 3:

分钟/ max_element 迭代器返回到最小/最大元素,最小/最大元件的不值。 你必须取消引用迭代器,以获得的价值出来,并将其分配给双。 那是:

cLower = *min_element(C.begin(), C.end());


文章来源: Using std::max_element on a vector
标签: c++ vector max min