C++11搜索对象的向量

C++11 searching a vector of objects

本文关键字:向量 对象 搜索 C++11      更新时间:2023-10-16

我有两个向量

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

向量中的对象都包含一个具有ID的int。我想看看当通过v查看时,它是否在z 中具有匹配的id

所以我想我可以使用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,为什么?

a我需要一些类似的东西。hpp?:

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

来自关于find_if:的cppreference

UnaryPredicate必须满足Predicate的要求。

维奇赞同谓词的概念:

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

该文本中规定了两项要求:

  1. 谓词(即lambda)必须返回可转换为bool的内容。cout的某些输出不够
  2. 谓词不允许在参数(即MyObj)上调用非约束函数

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

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

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

然而,这不是它应该如何实现:

  • 你应该使用引用而不是向量元素的副本(我几乎是确信你在现实中做到了)
  • 为了避免您报告的错误,您必须同时声明两个getID函数const。不管算法中的用法如何,都应该这样做,因为不改变对象的函数应该总是这样说

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

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

看起来,你有一个成员_g,为其捕获了this。前面在本例中提到的_g而不是捕获的,因为capture子句明确地将捕获限制为this。如果使用作用域中的_g,则getID()不需要是const