1

我有 2 个向量

std::vector<MyObj> v;
std::vector<MyObj2> z;

向量中的对象都包含一个int具有 ID 的对象。我想看看在浏览时是否v有匹配idz

所以我认为我可以使用 `std::find_if 和 Lambda。

for (int i=0; i < _z.size(); i++)
{
     MyObj2 _g = _z.at(i);

     auto iter = std::find_if(v.begin(), v.end(), [this](MyObj o) 
     {
        if (o.getID() == _g.getID())
        {
            std::cout << "we have a match" << std::endl;
        }
        else
        {
            std::cout << "we DO NOT have a match" << std::endl;
       }
    });
}

但我收到一个我不明白的错误。

43:成员函数“getID”不可行:“this”参数的类型为“const MyObj2”,但函数未标记为 const

我不明白什么必须标记为 const 以及为什么?

我需要在我的 .hpp 中类似的东西?:

MyObj2& operator= (const MyObj2&);
MyObj2& operator== (const MyObj2&); 
4

2 回答 2

0

cppreference 关于 find_if

UnaryPredicate 必须满足 Predicate 的要求。

最喜欢 Predicate的概念

Predicate 概念描述了一个函数对象,它接受一个迭代器参数,该参数被取消引用并用于返回一个可测试的值作为布尔值。
换句话说,如果一个算法首先接受一个谓词 pred 和一个迭代器,它应该能够通过 if (pred(*first)) {...} 之类的结构使用谓词来测试迭代器。
函数对象 pred 不应通过取消引用的迭代器应用任何非常量函数。该函数对象可以是指向函数的指针或具有适当函数调用运算符的类型的对象。

该文本中有两个要求:

  1. 您的谓词(即 lambda)必须返回可转换为 bool 的东西。一些输出cout是不够的。
  2. 您的谓词不允许在参数上调用非常量函数(即 MyObj)

但是,您的代码显示了许多编译错误,但与您在问题中陈述的错误无关。这是因为您没有提供SSCCE

  • 您没有_g在 lambda 表达式中捕获
  • 如果谓词没有返回可转换为 bool 的内容,则会出现编译错误(请参阅上述谓词的要求)
  • 你不匹配z并且_z

没有收到您描述的错误,因为在您的示例代码中,您从向量中复制了值,而不是获取 const 引用。复制当然很好,您可以将任何非常量函数应用于这些副本。我在这里有一个可编译的代码迷你示例:http: //ideone.com/o8tPED

但是,这不是应该如何实现的:

  • 你应该参考而不是矢量元素的副本(我几乎可以肯定你在现实中这样做)
  • 为避免您报告的错误,您必须将这两个getID函数声明为 const。无论算法中的用法如何,您都应该这样做,因为不更改对象的函数应该总是这样说。
于 2013-08-26T07:30:02.010 回答
0

您需要声明MyObj2::getID()const:编译器说得很清楚:

struct MyObj2 {
    int getID() const { ... }
    ...
};

看来,您有一个_gthis捕获的成员。此示例中前面_g提到的内容未被捕获,因为捕获子句明确将捕获限制为this. 如果您使用_gfrom 范围,则getID()不需要是const.

于 2013-08-26T05:01:39.150 回答