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 :

Liste Unique Non-Ordonnée


Sujet :

Langage C++

  1. #1
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut Liste Unique Non-Ordonnée
    Bonjour,

    Je cherche une liste /unique/non-ordonnée/ de int. C'est à dire qu'elle conserve l'ordre d'entrée des éléments.

    A la base j'utilise std::set, mais cette dernière ordonne la liste (ordre croissant). J'ai donc essayé unordered_set de <tr1/unordered_set>, sauf qu'elle ne réagit pas comme je le souhaitais. En effet, la liste range aussi dans l'ordre croissant.

    Ensuite j'ai voulu voir si il y avait une différence avec unordered_set de Boost, mais je n'arrive pas à l'implémenter dans mon compilateur.

    Connaissez vous une liste répondant à ce besoin? ou de Quel manière doit-je utiliser unordered_set?

    Merci pour vos réponses^^

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,
    Je pense que ça dépend de la taille finale de la liste. Si la liste n'est pas trop grande, il vaut probablement mieux ne pas chercher les complications et utiliser un simple vecteur + une vérification à chaque nouvelle insertion que le valeur n'est pas déjà présente dans le vecteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bool push_back_unique(std::vector<int>& myVec, int value)
    {
        if(std::find(myVec.begin(), myVec.end() == myVec.end())
       {
           myVec.push_back(value);
           return true;
       }
        return false;
    }
    C'est du O(n²) vu qu'il faut retraverser entièrement le vecteur à chaque nouvelle insertion pour la recherche... donc à surveiller quand même, il faudra surement être plus malin si par exemple le but final est de balancer une entière base de données dans la liste de plusieurs dizaines millions d’éléments.

  3. #3
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Le nom de unordered_set est assez mal choisi. Ça aurait dû s'appeler hash_set, si le nom n'avait pas posé des problèmes de compatibilité. Les données sont certes non triées, mais par contre, l'ordre d'insertion n'est quand même pas respecté.

    Maintenant, pour ton problème, si j'ai en entrée :
    Qu’appelles tu respecter l'ordre d'entrée ?
    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.

  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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Arzar Voir le message
    il faudra surement être plus malin si par exemple le but final est de balancer une entière base de données dans la liste de plusieurs dizaines millions d’éléments.
    Une solution un peu plus fine serait de dupliquer le stockage dans un vector (pour respecter l'ordre) et dans un set (pour faire des tests de doublon plus rapidement).
    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.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    En fait, Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    maliste.insert(1);
    maliste.insert(3);
    maliste.insert(2);
    maliste.insert(4);
    maliste.insert(6);
    maliste.insert(5);
    maliste.insert(3);
    Quand je parcours ma liste du début à la fin : 1,3,2,4,6,5,.

    Pour ton exemple, ça serait 1,4,2.


    Mais l'idée d'avoir un vector pour l'ordre et un set pour tester les doublons n'est vraiment pas mauvaise. Je vais la retenir^^. Mais il faut savoir que ma liste peut être composé de beaucoup d'élément...

    Par contre, je voulai savoir comment on comparait deux éléments de deux listes différentes (vector et map). Sans trop détailler, mon programme renvoyai des resultats différents de ce que j'attendais. (peut être que je devrai ouvrir une autre discussion?)

    Edit : la méthode qui consiste à avoir une liste set et une autre vector est vraiment pratique

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Liste non ordonnée en HTML
    Par Contrec dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/12/2009, 13h05
  2. Problème liste non-ordonné interligne IE
    Par Addict` dans le forum Mise en page CSS
    Réponses: 6
    Dernier message: 13/02/2009, 11h00
  3. [HTML 4.0] Centrer une liste non ordonnée sans CSS
    Par jeremdu94 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 28/12/2008, 23h04
  4. [XHTML - W3C] liste non ordonnée en XHTML 1.1
    Par m4dm4x dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 11/09/2008, 03h15
  5. liste non ordonnée en css
    Par logiciel_const dans le forum Mise en page CSS
    Réponses: 11
    Dernier message: 30/07/2008, 15h08

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