max_element - maximum number in vector c++
Usar std:: max_element en un vector<double> (3)
Como han dicho otros, std::max_element()
y std::min_element()
devuelven iterators , que necesitan ser desreferenciados para obtener el valor .
La ventaja de devolver un iterador (en lugar de solo el valor) es que le permite determinar la posición del (primer) elemento en el contenedor con el valor máximo (o mínimo).
Por ejemplo (usando C ++ 11 para abreviar):
#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;
}
Esto produce:
Max element is 5 at position 4
min element is 1 at position 0
Nota:
El uso de std::minmax_element()
como se sugiere en los comentarios anteriores puede ser más rápido para grandes conjuntos de datos, pero puede dar resultados ligeramente diferentes. Los valores para mi ejemplo anterior serían los mismos, pero la posición del elemento "máximo" sería 9
ya que ...
Si varios elementos son equivalentes al elemento más grande, se devuelve el iterador al último elemento.
Estoy intentando usar std::min_element
y std::max_element
para devolver los elementos min y max en un vector de dobles. A mi compilador no le gusta cómo estoy tratando de usarlos, y no entiendo el mensaje de error. Por supuesto, podría escribir mi propio procedimiento para encontrar el mínimo / máximo, pero me gustaría saber cómo usar las funciones.
#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;
}
Aquí está el error del compilador:
../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
¿Alguien podría explicar lo que estoy haciendo mal?
min / max_element devuelve el iterador al elemento min / max, no el valor del elemento min / max. Debe eliminar la referencia del iterador para obtener el valor y asignarlo a un doble. Es decir:
cLower = *min_element(C.begin(), C.end());
min_element
y max_element
devuelven iteradores, no valores. Entonces necesitas *min_element...
y *max_element...