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

Ant*_*nty 25 c++ algorithm lambda stl c++11

我有一个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; } 
Run Code Online (Sandbox Code Playgroud)

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

eca*_*mur 29

你的捕获和争论已经逆转了.里面的位[]是捕获; 里面的位()是参数列表.在这里,您要捕获局部变量i并将其a作为参数:

[i](LWItem a)->bool { return a->GetID()==i; } 
Run Code Online (Sandbox Code Playgroud)

这实际上是使用局部变量创建functor类的简写i:

struct {
   LWItemID i;
   auto operator()(LWItem a) -> bool { return a->GetID()==i; } 
} lambda = {i};
Run Code Online (Sandbox Code Playgroud)

  • 谢谢您的帮助.当我非常疲倦时,这会教我尝试编码(尽管我似乎从未学过). (4认同)

Jiw*_*wan 13

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

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

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