2013-05-03 55 views
17

私はクラスを含むstd :: mapを持っていて、そのクラスにはidがあります。私はstd :: find_ifのC++ラムダ式?

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

私はラムダキャプチャ変数が見つからないというエラーが出るのセットで見つけようとしているIDを持っているが、私は私はそれを得るために行うことになってる何見当がつかない反復処理中にコンテナの内容を取得します。 また、私はループでこれを行うことはできませんが、私はラムダ関数を学ぼうとしています。

+2

あなたは '宣言しました:

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

これは、ローカル変数iと数子のクラスを作成するための速記が効果的である:ここでは、ローカル変数iをキャプチャして、引数としてaを取りたいです'?何を探していますか? 'map'または' set'? –

+0

'selectedItems'は' LWItem'sのコンテナなので、ラムダは 'LWItemID'を引数として取ることができません。それは愚かな質問のように見える場合は、 'LWItem'(' const& '可能) –

+0

謝罪を取らなければなりません。私の主な問題は、ローカルの 'LWItem'変数、' i'、 'std :: find_if'で反復される要素をどのようにキャプチャするのか不明であったようです。 –

答えて

20

キャプチャと引数を逆にしました。 []の中のビットはキャプチャです。 ()の中のビットが引数リストです。

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

助けてくれてありがとう。これは、私が超疲れているとき(私は決して習うように見えませんが)、試してコードするよう教えてくれます。 –

10

私はあなたのコードは次のようになります理解して何から:

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

これは私がpreviosuly宣言IDであることで、私と同じIDを持つLWItemをキャプチャします。

+0

大変ありがとうございました:) –