C++11搜索对象的向量
C++11 searching a vector of objects
我有两个向量
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不应通过去引用迭代器应用任何非常量函数。此函数对象可以是指向函数的指针,也可以是具有适当函数调用运算符的类型的对象。
该文本中规定了两项要求:
- 谓词(即lambda)必须返回可转换为bool的内容。
cout
的某些输出不够 - 谓词不允许在参数(即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
。
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 迭代时从向量和内存中删除对象
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 如何创建从同一类继承的不同对象的向量
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 从多个源构造一个对象,包括一个对象向量
- 在C 中,是否有可能在不兼容类型的std ::向量对象之间传输不同类型的缓冲区
- 将向量对象存储在共享指针投掷错误中
- E0312,C2664尝试将向量对象作为函数参数传递时错误
- 相对于向量对象的两个成员,找到两个向量的相交的有效方法
- 将数据从文件读取到向量对象
- C 向量对象访问
- 向量对象声明后的括号是什么意思
- 2向量对象指向相同的分配内存
- 如何返回向量对象
- 传递单个或向量对象时没有重载函数的实例
- 指向数组和向量对象的指针
- 向量对象库,可以存储其他对象类型的对象
- 如何从另一个向量/对象集构造新的向量/指针集