web-dev-qa-db-fra.com

Expression lambda C ++ dans std :: find_if?

J'ai un std :: map qui contient une classe et cette classe a un id. J'ai un identifiant que j'essaie de trouver dans l'ensemble

typedef std::set<LWItem> ItemSet;
ItemSet selectedItems;
LWItemID i = someID;

ItemSet::iterator isi;
isi = std::find_if(selectedItems.begin(), selectedItems.end(), [&a](LWItemID i)->bool { return a->GetID()==i; } 

Je reçois une erreur indiquant que la variable de capture lambda est introuvable, mais je n'ai aucune idée de ce que je suis censé faire pour qu'elle capture le contenu du conteneur lors de son itération. De plus, je sais que je ne peux pas faire cela avec une boucle, mais j'essaie d'apprendre les fonctions lambda.

25

Vous avez inversé votre capture et votre argument. Le bit à l'intérieur du [] est la capture; le peu à l'intérieur () est la liste des arguments. Ici, vous voulez capturer la variable locale i et prendre a comme argument:

[i](LWItem a)->bool { return a->GetID()==i; } 

Il s'agit en fait d'un raccourci pour créer une classe de foncteur avec la variable locale i:

struct {
   LWItemID i;
   auto operator()(LWItem a) -> bool { return a->GetID()==i; } 
} lambda = {i};
29
ecatmur

D'après ce que je comprends, votre code devrait ressembler à ceci:

auto foundItem = std::find_if(selectedItems.begin(), selectedItems.end(), 
[&i](LWItem const& item) 
{ 
return item->GetID() == i; 
});

Cela capturera le LWItem qui a un ID égal à i, i étant un ID déclaré précédemment.

13
Jiwan