web-dev-qa-db-ja.com

std :: find_ifのC ++ラムダ式?

クラスを含むstd :: mapがあり、そのクラスにはidがあります。セットで見つけようとしているIDがあります

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

ラムダキャプチャ変数が見つからないというエラーが表示されますが、コンテナの内容を繰り返し処理するために取得するために何を行うべきかはわかりません。また、ループでこれを行うことはできませんが、ラムダ関数を学習しようとしています。

25

キャプチャと引数が逆になっています。 []内のビットはキャプチャです。 ()内のビットは引数リストです。ここでは、ローカル変数iをキャプチャし、aを引数として受け取ります。

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

これは、ローカル変数iを使用してファンクタークラスを作成するための略記法です。

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

私が理解していることから、コードは次のようになります:

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

これは、iが以前に宣言されたIDである、iに等しいIDを持つLWItemをキャプチャします。

13
Jiwan