Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1729 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Supprimer doublons dans un vector

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Supprimer doublons dans un vector

n°2070655
clements42
Posté le 18-04-2011 à 14:52:11  profilanswer
 

bonjour, voici le problème auquel je suis confronté.
 
J'ai une classe Coordonnée :

Code :
  1. class Coordonees
  2. {
  3.     private:
  4.         int x;
  5.         int y;
  6. };


 
dans une méthode d'une autre classe, j'ai un vector de coordonnée contenant des doubles (double au sens : même couple de X et Y). Je souhaite donc les supprimer.
 
Mon code :
 

Code :
  1. for(int a = 0; a < retour.size() ; a++){
  2.       for(int b = a+1; b < retour.size() ; b++){
  3.            if((retour[a].getX()) == (retour[b].getX()) && ((retour[a].getY()) == (retour[b].getY()))) {
  4.                  retour.erase(retour.begin() + b);
  5.           }
  6.       }
  7. }


retour étant le vector.
 
Si je n'utilise pas ce code, le vector contient une vingtaine de Coordonnée, alors qu'avec le code il n'y en a plus que 8 que voici. Malheureusement comme on peut le constater, des doubles persistent (ici il y a trois fois le couple 6 et 6).
 
http://nsa25.casimages.com/img/2011/04/18/110418025523381246.png
 
si vous pouviez m'aider, merci.

mood
Publicité
Posté le 18-04-2011 à 14:52:11  profilanswer
 

n°2070680
shaoyin
Posté le 18-04-2011 à 16:00:28  profilanswer
 

Lorsque tu supprimes l'élément à la position b (ligne 4), l'élément suivant vient occuper la position b. Or, tu es en fin de boucle, donc b est incrémenté et tu perds un élément potentiellement en doublon.
 
A mon avis, tu devrais :
- changer tes boucles 'for' en boucles 'while', pour gérer toi-même l'incrémentation des éléments que tu parcours
- utiliser des itérateurs (la fonction erase retourne un itérateur sur l'élément suivant celui qui a été supprimé).
 
Ainsi, tu n'incrémentes ton itérateur que s'il n'a pas été supprimé.

n°2070732
SquiZZ
Posté le 18-04-2011 à 18:28:18  profilanswer
 

Si l'ordre de tes points n'est pas important, tu peux trier avec std::sort puis utiliser std::unique qui supprime les éléments consécutifs identiques.
Ces deux fonctions sont définies dans <algorithm>

n°2072954
SBAM
Best recording of rach 3.
Posté le 30-04-2011 à 16:46:56  profilanswer
 

Pourquoi ne pas remplacer ton vector par un set ?  :o

n°2072968
Joel F
Real men use unique_ptr
Posté le 30-04-2011 à 20:31:49  profilanswer
 

l'idiome correct est de faire un remove_if suivi d'un erase.
 
http://en.wikipedia.org/wiki/Erase-remove_idiom

n°2072974
nekofun
Posté le 30-04-2011 à 22:58:09  profilanswer
 

http://www.cplusplus.com/reference/algorithm/
 
sort (myvector.begin(), myvector.end(), taFonctionDeTri);
 
suivi de
 
unique (myvector.begin(), myvector.end(), taFonctionDeComparaison);
 
Ce n'est pas optimal mais ça fait le job.

n°2073250
Un Program​meur
Posté le 02-05-2011 à 13:47:29  profilanswer
 

Il faut filler le resultat de unique a erase ou tu va avoir un probleme: quand on n'a que des iterateurs en arguments, enlever des elements au conteneur est difficile...


---------------
The truth is rarely pure and never simple (Oscar Wilde)

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Supprimer doublons dans un vector

 

Sujets relatifs
site mobil: supprimer l'espace en haut et à gaucheEliminer doublons sur base de données
[C++] Vector class et pointer[C++] (2) Une histoire de vector
Structure clé , valeur avec ordre et doublonsSupprimer un INDEX sur PHPMYADMIN
Afficher/supprimer le contenu d'une bdd en fonction d'un id précis[BATCH] Supprimer une clé du registre bien définit ? [RESOLU]
Bouton supprimer / DébutantSupprimer des lignes
Plus de sujets relatifs à : Supprimer doublons dans un vector


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR