IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Supprimer doublons dans un vector


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut Supprimer doublons dans un vector
    bonjour, voici le problème auquel je suis confronté.

    J'ai une classe Coordonnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Coordonees
    {
        private:
            int x;
            int y;
    };
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     for(int a = 0; a < retour.size() ; a++){
          for(int b = a+1; b < retour.size() ; b++){
               if((retour[a].getX()) == (retour[b].getX()) && ((retour[a].getY()) == (retour[b].getY()))) {
                     retour.erase(retour.begin() + b);
              }
          }
    }
    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).



    si vous pouviez m'aider, merci.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    A mon avis, le problème est que si deux doublons se suivent, alors vous sautez le second car la délétion décale tous les indices. Un exemple en remplacant les couples par des lettres pour simplifier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    indices:  0 1 2 3 4 5 6 7 8
    contenus: a b c d e f f f z
    quand a=5, vous comparez avec l'indice b=6: c'est un doublon => vous l'effacez donc tout se décale d'un cran vers la gauche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    indices:  0 1 2 3 4 5 6 7
    contenus: a b c d e f f z
    cependant, l'itération se poursuit et la valeur de b est passée à l'indice 7, donc le doublon qui est passé de l'indice 7 à l'indice 6 à cause de l'effacement du premier doublon n'est jamais testé et reste...

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Ne serait-il pas intéressant d'utiliser un conteneur de type set ou map si tu ne veux pas de duplicata de tes données ?

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Ton algorithme est en O(n²), alors qu'on peut faire un O(n log n) : Commence par trier les données, puis ensuite enlève les doublons.

    Un truc genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::sort(retour.begin(), retour.end());
    retour.erase(std::unique(retour.begin(), retour.end()), retour.end());
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Supprimer doublons dans fichier
    Par roman67 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 06/11/2008, 14h33
  2. [Tableaux] Supprimé doublon dans un array
    Par arnaudperfect dans le forum Langage
    Réponses: 9
    Dernier message: 13/02/2008, 09h38
  3. [MySQL] Supprimer doublon dans une liste
    Par Gad29 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/06/2007, 14h13
  4. Supprimer doublons dans requete
    Par fifoux dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/03/2007, 11h54
  5. elimination de doublons dans un vector
    Par absolut75 dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 25/09/2006, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo