如何将lambda用于std :: find_if

Tim*_*Tim 8 c++ lambda stl

我试图使用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(), ???);
Run Code Online (Sandbox Code Playgroud)

我不知道该放什么 ???

我见过的所有示例都有一个lambda,它使用硬编码值来检查ID.我想要的是只有当id toFind与向量中某个项的id 匹配时才返回迭代器/成功.

我看到的所有示例都没有告诉我如何传递这两个参数

编辑

附加信息我有两种不同的场景我必须使用它,其中有一个结构的==运算符和另一个结构没有运算符== - 我不能创建一个因为标准找到这种情况的匹配并不像对等运算符那样严格.

(感谢所有回复的人;我能够在一个案例中使用find()并且在你的帮助下能够使用find_if()进行另一个案例)

Ker*_* SB 18

试试这个:

std::find_if(
    myVector.begin(), myVector.end(),
    [&toFind](const MyStruct& x) { return x.m_id == toFind.m_id;});
Run Code Online (Sandbox Code Playgroud)

或者,如果您已==为其定义了适当的重载MyStruct,则可以使用find:

std::find(myVector.begin(), myVector.end(), toFind);  // requires ==
Run Code Online (Sandbox Code Playgroud)

find_if当您进行某种异构查找时,该版本通常是最佳的,例如,如果您只是给出了一个int,而不是一个值MyStruct.


Nat*_*ica 5

这就是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; } );
Run Code Online (Sandbox Code Playgroud)

因此,[&]says通过引用捕获了lambda主体中使用的所有变量。在(const auto& val)使operator()拉姆达的模板,让你在任何类型的需要。然后,我们在身体中比较从传递find_if到的内容toFind