在vector <double>上使用std :: max_element


75

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

#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

有人可以解释我在做什么错吗?


4
请注意,如果您使用的是C ++ 11,则可以使用std::minmax_element
GManNickG 2012年

@GManNickG:我不知道该功能。由于行为不同,我在答案中添加了一条注释以将其合并。
Johnsyweb 2012年

Answers:


106

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


24
迭代器是指向事物的指针。但是它可能是也可能不是普通指针。例如,如果迭代器引用列表中的对象,则对其进行递增使其指向列表中的下一个对象。增加普通指针仅对保证向量将其内容存储在序列存储地址中的向量这样的集合进行。
大卫·史瓦兹

2
如果向量为空,则会*max_element引发错误。是否有解决此问题的解决方案?现在,我检查向量是否为空,然后使用*max_element
Moj 2013年

我认为这是最好的解决方案。无论如何,您都需要特别处理该案件,因为没有可以返回的明智值。
David Schwartz 2013年

3
@Moj:您可以对照来检查迭代器C.end()
intelfx 2014年

56

就像其他人所说的,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因为...

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


2
@synaptik:这也应该与其他容器类型一起使用:)
Johnsyweb

26

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

cLower = *min_element(C.begin(), C.end());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.