2015-12-28 1 views
0

code ici: http://codepad.org/zbJCVnL0Pourquoi n'efface-t-il pas() (apparemment) l'itérateur?

Image de ce que je veux dire ici:

screenshot

La boucle while qui trouve où le « (» ou «) » valeurs de la liste se produisent et les efface, puis produit (en déréférenciant) l'élément de la liste après qu'il a effacé l'élément de parenthèse ... mais il sort ce qui ne devrait plus être là! Le déréférencement de l'itérateur immédiatement après l'utilisation de iter = object.erase (iter) donne la première valeur qui aurait dû être effacée.

Mais dans la boucle suivante, la liste est affichée en entier en utilisant le déréférencement, et tous les éléments qui auraient dû être effacés sont effacés et n'apparaissent pas. Que se passe-t-il ici?

+0

Quelle sortie ne vous attendez –

+0

pour les supports à enlever les années cout dans la boucle while ne le font pas, mais lorsque la boucle for sort la liste, les parenthèses ont disparu. – Kostoglotov

Répondre

1

Suivez simplement la logique de votre code à la main et vous verrez que c'est ce qu'il devrait sortir.

Par exemple, pourquoi émet-il un ")"? Eh bien, quand vous traitez le "d" avant le ")", vous voyez que "d" n'est pas un "(" ou ")", incrémente l'itérateur, et affiche ce qu'il pointe après l'incrémentation, qui est maintenant le ")".

Pourquoi est-il sortie le second « (»? Eh bien, la règle «) », dit à la sortie du caractère après, qui dans ce cas est « (».

Votre code fait exactement ce que vous devriez ont prévu Changer votre code pour signaler ce qu'il fait peut le rendre plus facile à comprendre:.?.

cout << "starting loop" << endl; 
    while (sit != llist.end()) 
    { 
      cout << endl << "The iterator points to '" << *sit << "'." << std::endl; 
      if (*sit == '(') { cout << "Rule 1"; sit = llist.erase(sit); cout << *sit; } 

      else if (*sit == ')') { cout << "Rule 2"; sit = llist.erase(sit); cout << '\n' << *sit; } 

      else { sit++; if (sit != llist.end()) { cout << "Rule 3" ; cout << *sit; } } 
    } 
    cout << "loop finished" << endl;