我有一个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函数。
答案 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。