2017-09-11 3 views
0

Mon programme lit donc simplement une entrée de nombres et les liste dans l'ordre. Comme vu dans la sortie. Sans l'utilisation de la bibliothèque de l'algorithme, je l'ai trié et se débarrasser des données répétées. Cependant, si une valeur de données est répétée, la dernière valeur du vecteur n'est pas imprimée. Est-ce que j'utilise incorrectement le .erase?Erreur logique en utilisant .erase (C++)

void remove_repeated(int size, vector<int>& num_vec){ 
    for(int i = 0; i < num_vec.size(); i++){ 
     if(num_vec[i]==num_vec[i+1]){ 
      num_vec.erase((num_vec.begin()+i)); 
     } 
    } 
} 

sortie lorsqu'aucune valeur est répétée:

    **Welcome to the HW Reading Program** 
Please, enter your HW:1-10 

Do Problems: 1, 2, 3, 4, 5, 6, 7, 8, 9,and 10 

sortie lorsqu'une valeur est répétée:

    **Welcome to the HW Reading Program** 
Please, enter your HW: 1-10,1-3 

Do Problems: 1, 2, 3, 4, 5, 6, 7, 8,and 9 
+1

A) MVCE B) Fixez votre indentation. TIA. – Borgleader

+2

C'est beaucoup de code non pertinent que vous avez posté. Vous pourriez avoir juste posté un simple programme 'main', remplir un vecteur avec des valeurs codées en dur répétées, et simplement appeler' remove_repeated' pour voir comment ça fonctionne. Le tri n'a rien à voir avec le problème que vous rencontrez. – PaulMcKenzie

+0

@Borgleader A) Je l'ai réparé au mieux de mes capacités. B) Quelle partie de mon indentation n'est pas acceptable? – Pouya

Répondre

4

Après avoir effacé élément à l'index i du vecteur, l'élément suivant est à l'index i, pas à l'index i+1. vous devez aussi prendre soin de ne pas sortir des limites lorsque l'on compare à i+1, à savoir la boucle doit ressembler à ceci:

for(int i = 0; i < num_vec.size()-1;){ 
    if(num_vec[i]==num_vec[i+1]){ 
     num_vec.erase((num_vec.begin()+i)); 
    } else { 
     i++; 
    } 
} 

Aussi, vous devriez envisager d'utiliser ce que la bibliothèque standard a à offrir. Un set ne contient que des éléments uniques, ou vous pouvez utiliser erase + unique (voir par exemple here pour plus de détails).