No se puede compilar en el retorno de std :: min_element

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

Deseo para calcular el mínimo en el mapa.

Este código no pudo compilar. Pensé que la manera de utilizar std::min_element's regresaron iterador es refiriéndose a ella. ¿No?

El mensaje de error en la std::coutlínea es operandos no válidos a la expresión binaria.

Publicado el 19/09/2018 a las 13:20
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
7

std::map::iterator::value_type(es decir. el tipo de *it) es std::pair<const double,double>, y no hay sobrecarga estándar de operator<<(std::ostream &, std::pair<const double,double>).

Se podría definir ya sea uno, o algo así std::cout << it->first << ' ' << it->second << std::endl;.

Respondida el 19/09/2018 a las 13:23
fuente por usuario

votos
4

El tipo de elemento de std::mapuna std::pair<const key_type, mapped_type>. *itle dará una referencia a eso. No hay ningún operador de salida de salida definida por std::pairlo que el código falla al compilar.

Se le puede añadir una sobrecarga por ella como

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

o simplemente imprime lo que quiere recibir

std::cout << it->first << " " << it->second << "\n";
Respondida el 19/09/2018 a las 13:27
fuente por usuario

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