[英]How to use lambda for std::find_if
我试图使用std :: find_if来查找符合某些条件的对象。 考虑以下:
struct MyStruct
{
MyStruct(const int & id) : m_id(id) {}
int m_id;
};
...
std::vector<MyStruct> myVector; //... assume it contains things
MyStruct toFind(1);
std::vector<MyStruct>::iterator i = std::find_if(myVector.begin(), myVector.end(), ???);
我不知道该放什么???
我见过的所有示例都有一个lambda,它使用硬编码值来检查ID。 我想要的是只有当toFind
的id与向量中某个项的id匹配时才返回迭代器/成功。
我看到的所有示例都没有告诉我如何传递这两个参数
编辑
附加信息我有两种不同的场景我必须使用它,其中有一个结构的==运算符和另一个结构没有运算符== - 我不能创建一个因为标准找到这种情况的匹配并不像对等运算符那样严格。
(感谢所有回复的人;我能够在一个案例中使用find()并且在你的帮助下能够使用find_if()进行另一个案例)
尝试这个:
std::find_if(
myVector.begin(), myVector.end(),
[&toFind](const MyStruct& x) { return x.m_id == toFind.m_id;});
或者,如果您为MyStruct
定义了适当的==
重载, MyStruct
可以使用find
:
std::find(myVector.begin(), myVector.end(), toFind); // requires ==
当你有某种异构查找时, find_if
版本通常是最好的,例如,如果你只是给了一个int
,而不是MyStruct
的值。
这是lambda捕获发挥作用的地方。 除了说明将哪种类型的参数传递给lambda之外,您还可以说明使用哪些现有变量来构造lambda。 所以在这种情况下你会有类似的东西
std::vector<MyStruct>::iterator i = std::find_if(myVector.begin(),
myVector.end(),
[&](const auto& val){ return val.m_id == toFind.m_id; } );
所以[&]
表示通过引用捕获lambda体中使用的所有变量。 (const auto& val)
使lambda的operator()
成为模板,并允许您接受任何类型。 然后在正文中我们比较从find_if
传递到toFind
。
您可以使用以下内容:
MyStruct toFind(1);
std::vector<MyStruct>::iterator i =
std::find_if(myVector.begin(), myVector.end(),
[&](const auto& e) { return e.id == toFind.id; });
请执行以下操作:
std::find_if(myVector.begin(), myVector.end(),
[&toFind] (const auto &ele) { return ele.m_id == toFind.m_id}; );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.