在向量<double>上使用std :: max_element

syn*_*tik 72 c++ vector max min

我正在尝试使用std::min_elementstd::max_element返回双精度矢量中的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;
}
Run Code Online (Sandbox Code Playgroud)

这是编译器错误:

../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
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*rtz 105

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

  • 迭代器是一个指向它的指针.但它可能是也可能不是普通的指针.例如,如果迭代器引用列表中的对象,则递增它会使其指向列表中的下一个对象.增加普通指针只对保证将其内容存储在序列存储器地址中的向量集合执行. (24认同)
  • @Moj:你可以检查`C.end()`的迭代器. (3认同)
  • 如果向量为空,则**max_element`会引发错误.有没有解决方案来处理这个问题?现在我检查vector是否为空,然后使用`*max_element` (2认同)

Joh*_*web 55

正如其他人所说,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;
}
Run Code Online (Sandbox Code Playgroud)

这会产生:

Max element is 5 at position 4
min element is 1 at position 0
Run Code Online (Sandbox Code Playgroud)

注意:

std::minmax_element()对于大型数据集,使用上述注释中的建议可能会更快,但可能会产生略微不同的结果.上面我的示例的将是相同的,但"max"元素的位置将是9...

如果多个元素等效于最大元素,则返回最后一个元素的迭代器.

  • @synaptik:这也适用于其他容器类型:) (2认同)

Cor*_*lks 26

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

cLower = *min_element(C.begin(), C.end());
Run Code Online (Sandbox Code Playgroud)