C++ std::find() 寻址返回向量的类函数时的意外行为
C++ std::find() unexpected behavior when addressing a Class function returning a vector
我是一个理论问题。我有一个类Patient
其中我有一个函数,它返回类本身的向量Patient.getVars()
class Patient {
#... rest of class ...
std::vector<std::string> vVar;
public :
void addVar( std::string var )
{
vVar.push_back(var);
}
std::vector<std::string> getVars()
{
return vVar;
};
#... rest of class ...
}
我注意到,如果我在调用类函数vVar
与std::find()
一起检查向量的元素:
if ( std::find ( vPatientClass[ posPz ].getVars().begin(), vPatientClass[ posPz ].getVars().end(), var_name ) == vPatientClass[ posPz ].getVars().end() ) {
# .... rest of code ....
它告诉我,当它实际上不存在时,它是存在的,反之亦然。
否则,如果我复制矢量并在其上找到:
std::vector<std::string> vPzVars = vPatientClass[ posPz ].getVars();
if ( std::find ( vPzVars.begin(), vPzVars.end(), var_name ) == vPzVars.end() ) {
# .... rest of code ....
它的行为符合预期!这对我来说非常重要...有什么线索吗?
PS:我通过Patient
对象的位置来称呼它[ posPz ]
因为它vPatientClass
是Patient
类对象的向量。
提前感谢您的任何建议!
您的getVars
成员返回内部向量的副本:
std::vector<std::string> getVars()
{
return vVar;
};
因此,在有问题的std::find
调用中,您调用Patient::getVars()
3 次并获得 3 个不同的向量副本。虽然值相同,但您从begin()
和end()
获得的迭代器彼此不兼容。您可以改为通过引用返回向量:
const std::vector<std::string>& getVars() const
{
return vVar;
};
相关文章:
- 如何通过派生类函数更改基类中的向量
- 如何在基类指针向量的元素上应用重载的多态函数
- 从父类的向量访问子类函数,而无需向下转换
- C++ std::find() 寻址返回向量的类函数时的意外行为
- 如何在另一个类的向量中调用派生类的析构函数
- 如何在不复制的情况下将向量向量从类函数传递到功能
- 自定义类向量的类函数的分割错误
- 如何在类函数中编辑向量的私有成员
- 将基类的向量传递给接受超类向量的函数
- Push_back类定义向量的函数
- C++类的向量,不能在所述类的构造函数内部push_back
- 派生类对象覆盖对象向量中的基类函数
- 调用模板化类的向量的成员函数
- 使用派生类的向量映射调用其类的函数
- 如何访问类函数中的向量
- 从向量访问某些类函数C++的问题
- 模板类中向量向量的迭代函数构建
- 我在创建对象并使用向量而不是数组使用它们的类函数时遇到问题......我做错了什么?
- 使用模板将类函数应用于对象向量
- 如何将一个以特征向量为参数的函数传递给另一个类/函数并返回一个特征向量