std :: find_if中的C ++ lambda表达式?

时间:2013-05-03 20:05:58

标签: c++ algorithm c++11 stl lambda

我有一个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; } 

我得到一个错误,说找不到lambda捕获变量,但是我不知道我应该做什么来让它在迭代时捕获容器内容。 另外,我知道我不能用循环来做这个,但我正在尝试学习lambda函数。

2 个答案:

答案 0 :(得分:26)

你的捕获和争论被逆转了。 []内的位是捕获; ()内的位是参数列表。在这里,您要捕获局部变量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};

答案 1 :(得分:12)

根据我的理解,您的代码应如下所示:

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

这将捕获ID等于i的LWItem,其中i是preiosuly声明的ID。