Pregunta

Dado el siguiente código que realiza una búsqueda inversa en un mapa:

    map<char, int> m = {{'a', 1}, {'b', 2}, {'c', 3}, {'d', 4}, {'e', 5}};

    int findVal = 3;
    Pair v = *find_if(m.begin(), m.end(), [findVal](const Pair & p) {
        return p.second == findVal;
    });
    cout << v.second << "->" << v.first << "\n";

¿Es posible pasar un valor literal (en este caso 3) en lugar de tener que almacenarlo en una variable (es decir, FindVal) para que se pueda acceder a través de la lista de captura?

Obviamente, una de las limitaciones en este caso es que la Lambda está desempeñando el papel de un predicado unario para que no pueda pasarlo entre los paréntesis.

Gracias

¿Fue útil?

Solución

Puedes escribir esto:

 Pair v = *find_if(m.begin(), m.end(), [](const Pair & p) {
    return p.second == 3;
 });

No necesitas capturarlo para empezar.

Por cierto, no debes asumir std::find_if encontrará el elemento. Una mejor manera es usar Iterator:

 auto it = find_if(m.begin(), m.end(), [](const Pair & p) {
              return p.second == 3;
           });
 if (it == m.end() ) { /*value not found*/ }

 else {
     Pair v = *it;
     //your code
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top