75 votes

Utiliser std :: max_element sur un vecteur <double>

Je suis en train d'utiliser std::min_element et std::max_element de retour le min et max des éléments dans un vecteur de double. Mon compilateur n'aime pas la façon dont je suis en train d'essayer de les utiliser, et je ne comprends pas le message d'erreur. Je pourrais bien sûr écrire mon propre procédure pour trouver le min/max, mais je voudrais comprendre comment utiliser les fonctions.

#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;
}

Voici l'erreur du compilateur:

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

Quelqu'un pour expliquer ce que je fais mal?

108voto

David Schwartz Points 70129

min_element et max_element renvoient des itérateurs, pas des valeurs. Vous avez donc besoin de *min_element... et *max_element... .

57voto

Johnsyweb Points 45395

Comme d'autres l'ont dit, std::max_element() et std::min_element() retour des itérateurs, qui doivent être déréférencé pour obtenir la valeur.

L'avantage de renvoyer un itérateur (plutôt que de simplement la valeur), c'est qu'il vous permet de déterminer la position du premier élément dans le conteneur avec le maximum (ou le minimum) de la valeur.

Par exemple (à l'aide de C++11 par souci de concision):

#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;
}

Cela donne:

Max element is 5 at position 4
min element is 1 at position 0

Note:

À l'aide de std::minmax_element() comme suggéré dans les commentaires ci-dessus peut être plus rapide pour les grands ensembles de données, mais peut donner des résultats légèrement différents. Les valeurs pour mon exemple ci-dessus serait le même, mais la position de la "max" élément serait 9 depuis...

Si plusieurs éléments sont l'équivalent de l'élément le plus large, l'itérateur pour le dernier élément est renvoyé.

26voto

Cornstalks Points 9261

min / max_element renvoie l' itérateur à l'élément min / max, pas la valeur de l'élément min / max. Vous devez déréférencer l'itérateur pour obtenir la valeur et l'affecter à un double. C'est:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X