如何将 lambda 用于 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(), ???);

我不知道该放什么 ???

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

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

编辑

附加信息有两种不同的情况,我必须将其用于一种,其中结构有一个 == 运算符,另一种结构没有运算符 == - 我无法创建一个,因为标准为这种情况寻找匹配并不像用于等价运算符那样严格。

(感谢所有回复的人;我能够在一种情况下使用 find() 并且在您的帮助下能够在另一种情况下使用 find_if())

原文由 Tim 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

尝试这个:

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

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

 std::find(myVector.begin(), myVector.end(), toFind);  // requires ==

当您进行某种 异构 查找时, find_if 版本通常是最好的,例如,如果您刚刚获得 int ,而不是 MyStruct 的值。

原文由 Kerrek SB 发布,翻译遵循 CC BY-SA 3.0 许可协议

这就是 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_iftoFind 的内容。

原文由 NathanOliver 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题