Использование std:: max_element для вектора <double>

Я пытаюсь использовать std::min_element и std::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;
}

Вот ошибка компилятора:

../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

Кто-нибудь, пожалуйста, объясните, что я делаю неправильно?

Ответ 1

min_element и max_element возвращать итераторы, а не значения. Поэтому вам нужны *min_element... и *max_element....

Ответ 2

Как говорили другие, std::max_element() и std::min_element() верните итераторы, которые необходимо разыменовать, чтобы получить значение.

Преимущество возврата итератора (а не только значения) заключается в том, что он позволяет определить положение (первого) элемента в контейнере с максимальным (или минимальным) значением.

Например (с использованием С++ 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, поскольку...

Если несколько элементов эквивалентны наибольшему элементу, возвращается итератор в последний такой элемент.

Ответ 3

min/max_element возвращает итератор в элемент min/max, а не значение элемента min/max. Вы должны разыменовать итератор, чтобы получить значение и присвоить его двойнику. То есть:

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