it-swarm.com.de

C ++ - Lambda-Ausdruck in std :: find_if?

Ich habe eine std :: map, die eine Klasse enthält, und diese Klasse hat eine ID. Ich habe eine ID, die ich im Set zu finden versuche

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

Ich erhalte die Fehlermeldung, dass die Lambda-Erfassungsvariable nicht gefunden wurde, aber ich habe keine Ahnung, was ich tun soll, um den Containerinhalt beim Durchlaufen zu erfassen. Außerdem weiß ich, dass ich das nicht mit einer Schleife machen kann, aber ich versuche, Lambda-Funktionen zu lernen.

25

Sie haben Ihre Gefangennahme und Argumentation umgekehrt. Das Stück im [] ist die Erfassung; das bisschen drinnen () ist die Argumentliste. Hier möchten Sie die lokale Variable i erfassen und a als Argument verwenden:

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

Dies ist praktisch eine Abkürzung zum Erstellen einer Funktorklasse mit der lokalen Variablen i:

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

Soweit ich weiß, sollte Ihr Code so aussehen:

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

Dies erfasst das LWItem mit einer ID gleich i, wobei i eine zuvor deklarierte ID ist.

13
Jiwan