C++ std::find() 寻址返回向量的类函数时的意外行为



我是一个理论问题。我有一个类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 ...
}

我注意到,如果我在调用类函数vVarstd::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 ]因为它vPatientClassPatient类对象的向量。

提前感谢您的任何建议!

您的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;
};

最新更新