2012-12-01 6 views
1

Le but de mon programme de test est d'effacer une cellule dans un simple vecteur de chaînes comme ci-dessous. Le programme échoue (erreur de segmentation).std :: remove ne fonctionne pas

static void display(std::vector<std::string> const &vec) 
{ 
    std::vector<std::string>::const_iterator It = vec.begin(); 
    for (; It != vec.end(); ++It) 
     std::cout << *It << " "; 
    std::cout << std::endl; 
} 


int   main(void) 
{ 
    std::vector<std::string> vec; 
    size_t index = 0; 

    vec.push_back("Toto"); 
    vec.push_back("Titi"); 
    vec.push_back("Tata"); 
    vec.push_back("Tutu"); 

    display(vec); 

    std::vector<std::string>::iterator It = vec.begin(); 

    for (size_t idx = 0; It != vec.end(); ++It, idx++) 
     if (!(*It).compare("Tutu")) 
      index = idx; 

    vec.erase(std::remove(vec.begin(), vec.end(), index), vec.end()); //Segmentation fault 

    display(vec); 

    getchar(); 
    return (0); 
} 

Quelqu'un peut-il m'aider? Merci d'avance pour votre aide.

+0

Ne pas vous devez passer une chaîne à 'remove'? – chris

+1

Lisez à propos des arguments pour 'remove' plus attentivement. Il ne prend pas d'indice. –

Répondre

5
vec.erase(std::remove(vec.begin(), vec.end(), index), vec.end()); 

Vous devez passer l'élément réel (dans ce cas, de type std::string) à votre fonction erase.

Ainsi, au lieu de index, il devrait être somestring

+0

Merci beaucoup pour votre réponse – user1364743

0
  • vous ne pas mélanger itérateurs et indices homebrew. utilisez les itérateurs seulement.
  • algorithmes comme la copie - il existe des algorithmes externes à utiliser lorsque vous voulez vous déconnecter du type de conteneur réel et qu'il existe des fonctions membres qui effectuent un travail optimisé. dans votre cas, vec erase ne change jamais pour vous, il suffit de passer l'itérateur trouvé

    vec.erase (It);

0

Depuis que vous vérifiez l'égalité, il suffit d'utiliser std::remove:

vec.erase(std::remove(vec.begin(), vec.end(), "Tutu"), 
      vec.end()); 

Il est l'idiome standard. Si pour une raison quelconque, vous devez écrire la boucle vous-même:

std::vector<std::string>::const_iterator current = vec.begin(); 
while (current != vec.end()) { 
    if (*current == "Tutu") { 
     current = vec.erase(current) ; 
    } else { 
     ++ current; 
    } 
} 

(Encore une fois, l'idiome standard.)