25

我有一个包含一个类的 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 函数。

4

2 回答 2

29

你已经把你的捕获和论点颠倒了。里面的位[]是捕获;里面的位()是参数列表。在这里,您要捕获局部变量ia作为参数:

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

这实际上是使用局部变量创建仿函数类的简写i

struct {
   LWItemID i;
   auto operator()(LWItem a) -> bool { return a->GetID()==i; } 
} lambda = {i};
于 2013-05-03T20:48:32.203 回答
14

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

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

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

于 2013-05-03T20:48:23.293 回答