Ответ 1
min_element
и max_element
возвращать итераторы, а не значения. Поэтому вам нужны *min_element...
и *max_element...
.
Я пытаюсь использовать 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
Кто-нибудь, пожалуйста, объясните, что я делаю неправильно?
min_element
и max_element
возвращать итераторы, а не значения. Поэтому вам нужны *min_element...
и *max_element...
.
Как говорили другие, 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
, поскольку...
Если несколько элементов эквивалентны наибольшему элементу, возвращается итератор в последний такой элемент.
min/max_element возвращает итератор в элемент min/max, а не значение элемента min/max. Вы должны разыменовать итератор, чтобы получить значение и присвоить его двойнику. То есть:
cLower = *min_element(C.begin(), C.end());