Domanda

Dato il seguente codice che esegue una ricerca inversa su una mappa:

    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";

È possibile passare un valore letterale (in questo caso 3) invece di doverlo archiviare in una variabile (cioè Findval) in modo che sia possibile accedere tramite l'elenco di acquisizione?

Ovviamente uno dei vincoli in questo caso è che la lambda sta ricoprendo il ruolo di un predicato unario in modo da non poterlo passare tra le parentesi.

Grazie

È stato utile?

Soluzione

Puoi scrivere questo:

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

Non è necessario catturarlo per cominciare.

A proposito, non dovresti supporre std::find_if troverà l'elemento. Un modo migliore è usare iteratore:

 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
 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top