Ne peut pas compiler sur le retour de std :: min_element

voix
2
#include <map>
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    std::map<double, double> A;

    const auto it = std::min_element(A.begin(), A.end(),
                                [](decltype(A)::value_type& l, decltype(A)::value_type& r) -> bool { return l.second < r.second; });

    std::cout << *it << std::endl;
}

Je souhaite calculer le minimum sur la carte.

Ce code n'a pas réussi à compiler. Je pensais que la façon d'utiliser std::min_elementest retourné iterator est en y faisant référence. Non?

Le message d'erreur sur la std::coutligne est « opérandes invalides à l' expression binaire ».

Créé 19/09/2018 à 13:20
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
7

std::map::iterator::value_type(ie. le type de *it) est std::pair<const double,double>, et il n'y a pas de surcharge standard operator<<(std::ostream &, std::pair<const double,double>).

Vous pouvez soit définir un, ou faire quelque chose comme std::cout << it->first << ' ' << it->second << std::endl;.

Créé 19/09/2018 à 13:23
source utilisateur

voix
4

Le type d'élément std::mapest un std::pair<const key_type, mapped_type>. *itvous donnera une référence à cela. Il n'y a pas d' opérateur de sortie de sortie définie pour std::pairsorte que le code ne peut pas compiler.

Vous devez soit ajouter une surcharge comme

std::ostream& operator <<(std::ostream& os, const std::pair<const double, double>& e)
{
    return os << "{" << e.first << ", " << e.second << "}\n";
}

ou tout simplement imprimer ce que vous voulez comme

std::cout << it->first << " " << it->second << "\n";
Créé 19/09/2018 à 13:27
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more