Question

Compte tenu du code suivant qui fait une recherche inverse sur une carte:

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

Est-il possible de passer une valeur littérale (dans ce cas 3) au lieu d'avoir à le stocker dans une variable (c'est-à-dire FindVal) afin qu'elle puisse être accessible via la liste de capture?

De toute évidence, l'une des contraintes dans ce cas est que la Lambda remplit le rôle d'un prédicat unaire afin que je ne puisse pas le passer entre les parenthèses.

Merci

Était-ce utile?

La solution

Vous pouvez écrire ceci:

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

Vous n'avez pas besoin de le capturer pour commencer.

Btw, vous ne devriez pas supposer std::find_if trouvera l'élément. Une meilleure façon consiste à utiliser 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
 }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top