c++ - 如何将 lambda 用于 std::find_if

标签 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(), ???);

我不知道要在 中放入什么???

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

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

编辑

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

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

最佳答案

试试这个:

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 的值。

关于c++ - 如何将 lambda 用于 std::find_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42933943/

相关文章:

java - 使用 ConcurrentLinkedQueue 会导致错误

java - 为什么 eclipse 告诉我静态方法引用 ClassName::staticMethod 应该为 "accessed in a static way"?

c++ - 如果我创建一个修改值的迭代器,静态成员 "reference"应该是什么类型?

c++ - 如果 QMenu 是 unique_ptr,为什么 QAction 不添加到 QMenu?

c++如何在给定一组点的情况下绘制区域?

c++ - 为什么我的程序不会重新进入我的第二个 while 循环? C++

java - Arrays.setAll 不适用于 boolean 值

c++ - 当我使用 vector::erase 时它崩溃的原因可能是什么?

c++ - 将 vector 复制到 STL 中的列表的最佳方法?

c++ - 在哪里放置断言?