将find_if与指针向量一起使用:如何通过对 lambda 的常量引用传递指针?

Using find_if with a vector of pointers: How to pass pointer by const reference to lambda?

提问人:glades 提问时间:10/5/2021 更新时间:10/5/2021 访问量:358

问:

在下面的代码中,我尝试通过 find_if 比较指针向量,并确定哪个包含成员 a == 5(在这种情况下,当然两者都有,但它显示了我的情况)。但是,它不会编译。

#include <algorithm>

class obj
{
    public:
    int a = 5;
    int b = 2;
};

int main()
{
    obj A;
    obj B;
    std::vector<obj*> v = { &A, &B };

    std::find_if(begin(v), end(v), [](const (obj*)& instance) { if((*instance)->a == 5) return true; });
}

从我在这里的解释来看,find_if提供了实际的向量条目作为 lambda 函数的参数,该函数传统上是通过 const ref 获取的。但是我如何为指针指定它,因为我有指针作为向量条目?

(对于冗长的错误消息,请使用 gcc 11.1 将此代码带到 godbolt,但我想这是由于我不知道如何正确指定 lambda 参数)

C++11 Lambda STD 按指针传递 按常 量引用

评论

1赞 Caleth 10/5/2021
为什么需要对指针的常量引用?指针的复制成本很低

答:

2赞 rafix07 10/5/2021 #1

您希望对指针进行 const 引用,而不是对 const 指针的引用:

[](obj* const& instance) { if(instance->a == 5) return true; return false; }

或者使用 obj 指针的 type alias,它更清晰:

using PtrObj = obj*;
std::find_if(begin(v), end(v), [](const PtrObj& instance) { if(instance->a == 5) return true; return false; });

评论

0赞 glades 10/8/2021
谢谢。这太令人困惑了......如果这是代数,我用你的 PtrObj 代替 obj*,我会得到与我最初的想法完全相同的 (const obj*&),但它仍然是错误的。令人困惑的C++...