2010-10-10 5 views
11

Doublons possibles:
Vector.erase(Iterator) causes bad memory access
iterate vector, remove certain items as I go.supprimer tout itérer

Salut, J'ai écrit cela, mais je suis obtenir des erreurs lors de l'exécution, il

for (vector< vector<Point> >::iterator track = tracks_.begin(); track != tracks_.end(); track++) { 
     if (track->empty()) { // if track is empty, remove it 
      tracks_.erase(track); 
      track++; // is this ok? 
     }else { //if there are points, deque 
      track->erase(track->begin()); //my program crashes here after a while... ;(
     } 
    } 

I avoir un vecteur de vecto r de points (2 ints) dont j'appelle les pistes (1 piste est 1 vecteur de points) Je veux vérifier chaque piste et si elles contiennent des points puis supprimer le premier sinon supprimer la piste. Est-ce correct?

Merci d'avance.

+0

Quelles erreurs obtenez-vous? –

+0

Ce genre de question a déjà été posée plusieurs fois. Le premier résultat de la recherche de "C++ Erase Iterator" est http://stackoverflow.com/questions/2943912/vector-eraseiterator-causes-bad-memory-access qui répond également à cette question. – TheUndeadFish

+0

@ nacho4d: Pas directement lié, mais jetez un oeil à Boost MultiArray pour les structures bidimensionnelles. C'est un peu plus facile à utiliser qu'un type 'std :: vector >'. – lunaryorn

Répondre

33

Un vecteur erase() invalide les itérateurs existants, mais returns un nouvel itérateur pointant vers l'élément après celui qui a été supprimé. Cet itérateur retourné peut être utilisé pour continuer l'itération sur le vecteur.

Votre boucle pourrait être écrit comme ceci:

vector< vector<Point> >::iterator track = tracks_.begin(); 
while (track != tracks_.end()) { 
    if (track->empty()) { 
     // if track is empty, remove it 
     track = tracks_.erase(track); 
    } 
    else { 
     //if there are points, deque 
     track->erase(track->begin()); 
     ++track; 
    } 
} 
+0

Génial. Robuste, simple, ne nécessite pas de faire mon propre délégué, etc. – Eliot

+0

Il s'agit d'un modèle assez commun qu'il serait agréable de voir quelque chose comme ça apparaître dans std. – jbruni

+0

Que fait le 2ème "effacer" deque? L'itérateur "track" n'a même pas de méthode erase/begin? Impossible de le compiler et fonctionne bien sans. – lama12345