首页 > 解决方案 > 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 ...
}

我注意到,如果我检查调用类函数std::find()的向量元素:vVar

if ( std::find ( vPatientClass[ posPz ].getVars().begin(), vPatientClass[ posPz ].getVars().end(), var_name ) == vPatientClass[ posPz ].getVars().end() ) {
# .... rest of code ....

它告诉我当它实际上是ABSENT时它是PRESENT,反之亦然。

否则,如果我复制向量并在其上找到:

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对象的向量。

提前感谢您的任何建议!

标签: c++functionclass

解决方案


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

推荐阅读