矢量迭代器不兼容

IG8*_*G83 37 c++ stl vector

我有一个带有std :: vector数据成员的类,例如

class foo{
public:

const std::vector<int> getVec(){return myVec;} //other stuff omitted

private:
std::vector<int> myVec;

};
Run Code Online (Sandbox Code Playgroud)

现在在我的主要代码的某些部分,我试图迭代这样的向量:

std::vector<int>::const_iterator i = myFoo.getVec().begin();
while( i != myFoo.getVec().end())
{
   //do stuff
   ++i;
}
Run Code Online (Sandbox Code Playgroud)

我到达这个循环的那一刻,我得到了上述错误.

Fai*_*Dev 70

你得到这个的原因是,迭代器来自myVec的两个(或更多)不同的副本.每次调用时,您都会返回向量的副本myFoo.getVec().所以迭代器是不兼容的.

一些解决方案

返回一个const引用std::vector<int>:

const std::vector<int> & getVec(){return myVec;} //other stuff omitted
Run Code Online (Sandbox Code Playgroud)

另一个解决方案,可能更可取的是获取向量的本地副本并使用它来获取迭代器:

const std::vector<int> myCopy = myFoo.getVec();
std::vector<int>::const_iterator i = myCopy.begin();
while(i != myCopy.end())
{
  //do stuff
  ++i;
}
Run Code Online (Sandbox Code Playgroud)

也不+1 using namespace std;


Adr*_*ish 10

您正在返回该向量的副本.因为您按值返回 - 您对begin()和end()的调用是针对完全不同的向量.你需要返回一个const&它.

const std::vector<int> &getVec(){return myVec;}
Run Code Online (Sandbox Code Playgroud)

我会这样做略有不同.我让这个课程有点像标准容器

class Data
{
   public:
      typedef std::vector<int>::const_iterator const_iterator;

      const_iterator begin() const { return myVec.begin(); }
      const_iterator end() const { return myVec.end(); }
};

Data::const_iterator i=myFoo.begin();

while(i != myFoo.end())
{
//
}
Run Code Online (Sandbox Code Playgroud)


nmr*_*nmr 8

MSVC STL 调试断言“向量迭代器不兼容”的另一个原因是在无效迭代器上运行。

v.erase(i),然后比较i != v.end()擦除无效i,因此不能用于比较。