2 votes

Erreur de "Assertion de débogage" lancée lors de la boucle de l'itérateur

La fenêtre d'erreur apparaît immédiatement, le programme plante, etc.

Code:

void sort_star(vector& produit, vector& notation_etoiles) 
{
  vector::iterator piter;
  vector::iterator cycler;
  piter = produit.begin();
  cycler = notation_etoiles.begin();

  while (piter != produit.end() && cycler != notation_etoiles.end()) 
  {
    ++piter; ++cycler;

    cout << "/n|" << *piter << "|"; 
    cout << *cycler << " Étoiles";
  }
}

Je suis assez nouveau dans ce domaine et je ne connais pas beaucoup le C++. Une bonne explication serait grandement appréciée!

4voto

P i Points 2860

Dans votre boucle while, vous incrémentez vos itérateurs AVANT de les utiliser

...
while (piter != product.end() && cycler != star_rating.end()) {
    ++piter; ++cycler; <--- ICI

Cela signifie deux choses:

  • vous sautez le premier élément
  • votre itérateur atteint end() qui est un pointeur vers la POSITION-APRÈS-LA-FIN et non un élément valide voir ici.

CORRECTION Incrémentez à la fin de la boucle comme ceci:

while (piter != product.end() && cycler != star_rating.end()) {
    cout << "/n|" << *piter << "|"; 
    cout << *cycler << " Étoiles";

    ++piter; ++cycler;
}

2voto

JeJo Points 12135

Vous obtenez des itérateurs après les avoir incrémentés. Cela va

  • saute les premiers éléments à imprimer
  • va essayer de déréférencer l'std::vector::end itérateur. Évidemment std::vector::end:

    Renvoie un itérateur vers l'élément suivant le dernier élément de
    le conteneur. Cet élément agit comme un espace réservé; tenter d'y accéder
    entraîne un comportement indéfini.

Vous auriez pu le faire dans une boucle for comme suit:

for ( ; piter != product.end() && cycler != star_rating.end(); ++piter, ++cycler) 
{ // ^^                                                       ^^^^^^^^^^^^^^^^^^

    cout << "/n|" << *piter << "|" << *cycler << " étoiles";
}

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