2016-04-30 5 views
0

Dans le code ci-dessous si j'essaie de supprimer tout élément sauf le dernier le code fonctionne très bien. Mais si j'essaie de supprimer le dernier élément, il génère une erreur d'exécution. Pas certain de pourquoi ?problème dans la suppression du dernier élément de vecteur dans une boucle

#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 
int main() 
{ 
    vector<string> s; 
    s.push_back("Jacob"); 
    s.push_back("Jamal"); 
    s.push_back("Joseph"); 
    s.push_back("Janardan"); 
    vector<string>::iterator it; 

    for(it = s.begin(); it != s.end() ; it++) 
     cout<<*it<<endl; 

    for(it = s.begin(); it != s.end() ; it++) 
     if(*it == "Janardan") 
      s.erase(it); 

    for(it = s.begin(); it != s.end() ; it++) 
     cout<<*it<<endl; 

    return 0; 
} 

Répondre

1

La raison pour laquelle il renvoie une erreur d'exécution est parce que vous essayez d'augmenter l'itérateur en appelant it++ après avoir supprimé le dernier élément. Cela entraîne l'itération de l'itérateur. Une meilleure façon de résoudre ce serait:

for(it = s.begin(); it != s.end();) { 
    if(*it == "Janardan") { 
     it = s.erase(it); 
    } else { 
     it++; 
    } 
} 
1

Il y a 4 éléments dans le votre std::vector, de sorte que la boucle exécutera 4 fois.

Le problème est, lorsque vous supprimez un élément, tous les itérateurs après les éléments supprimés ne sont plus valides. Cela inclut it, qui pointe vers un élément qui n'existe plus, et donc il va lancer.


Il existe de nombreuses solutions que vous pouvez utiliser

  • Si le std::vector n'a pas de doublons, vous pourriez break après avoir effacé un élément

  • Utilisez std::remove_if

Comme si

std::remove_if(std::begin(s), std::end(s), [](const auto& value) { 
    return value == "Janardan"; 
}); 
  • Utilisez std::find

Comme si

auto iterator = std::begin(s); //Initialize iterator to the first element 

//std::find returns std::end(s) if it didn't find anything 
if ((iterator = std::find(std::begin(s), std::end(s), "Janardan")) != std::end(s)) 
    s.erase(iterator); //Erase element