41 votes

Itérateurs vectoriels incompatibles

J'ai une classe avec un membre de données std::vector, par exemple

 class foo{
public:

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

private:
std::vector<int> myVec;

};

Maintenant, dans une partie de mon code principal, j'essaie de parcourir le vecteur comme ceci :

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

Au moment où j'atteins cette boucle, j'obtiens l'erreur susmentionnée.

11voto

Adrian Cornish Points 8651

Vous retournez une copie du vecteur. Parce que vous retournez par valeur - vos appels à begin() et end() concernent des vecteurs complètement différents. Vous devez y retourner un const &.

 const std::vector<int> &getVec(){return myVec;}

Je ferais cela légèrement différemment cependant. Je ferais en sorte que la classe se comporte un peu comme un conteneur standard

 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())
{
//
}

6voto

nmr Points 5504

Une autre cause de l'assertion de débogage MSVC STL « itérateurs vectoriels incompatibles » fonctionne sur un itérateur invalidé.

C'est-à-dire v.erase(i) , puis comparer i != v.end() l'effacement invalide i et il ne peut donc pas être utilisé dans une comparaison.

2voto

jdehaan Points 14019

Le problème est que vous retournez toujours une autre copie du vecteur. Utiliser une référence :

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

2voto

zinking Points 1253

eh bien, je ne pense pas que la copie vectorielle puisse être la seule cause, cela me semble trop évident.

dans mon cas, je trouve juste qu'une pile corrompue, un tas, des modifications involontaires pourraient également entraîner cet échec, et cela masquera en fait la raison sous-jacente. dans mon cas, j'ai changé pour utiliser l'indexeur pour parcourir et trouver la cause première.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X