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

 C++ Discussion :

Questions sur la cohérence de std::set


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Par défaut Questions sur la cohérence de std::set
    Bonjour à tous.
    Je poste ce fil car je m'intéresse en ce moment au conteneur std::set.

    Tout d'abord, si j'ai bien compris, ce conteneur est censé contenir des instances constantes, uniques et ordonnées du type paramètre.

    Et donc si j'ai bien compris (voir ligne du dessus) et bien je ne comprends pas pourquoi ce conteneur propose (par exemple) :

    1. Un type iterator et un type const_iterator...
      pourquoi pas seulement le const_iterator ?
    2. Une méthode insert qui retourne un iterator et que cette méthode insert puisse prendre en paramètre un const_iterator pour lui indiquer où insérer un élement donné vu que std::set est censé conserver l'ordre...

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    l'ordre est définit par le Compare donné en argument au constructeur
    Il est exigé que les valeurs ne changent pas vis-à-vis de cet ordre, mais rien n'empeche de changer le reste.

    En gros, pour un set<int>, ce serait une erreur de modifier une valeur.
    Mais si tu as des classes possédant un identifiant, un que tu définis une fonction de tri sur cet identifiant (uniquement), tu peux très bien modifier le reste.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Par défaut
    Bon bon...
    du coup je ne comprends pas ce que dit cette page ?
    Je cite les extraits qui me turlupinent (onglet C++11) :
    Member type Definition Notes
    key_type The first template parameter (T)
    value_type The first template parameter (T)
    iterator a bidirectional iterator to const value_type * convertible to const_iterator
    const_iterator a bidirectional iterator to const value_type *
    *Note: All iterators in a set point to const elements.
    S'agit il d'une erreur de leur part du coup ?

    Et...
    Ma question est due au fait que je comptais me servir de ce conteneur pour une table de symboles rudimentaire.
    En faisant quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    using SymbolsTable = std::set<std::string> ; 
    using SymbolId = std::set<std::string>::const_iterator;
     
    class Identifier
    {
    SymbolId id;
    public :
    Identifier(std::string&& s, SymbolsTable& stab) : id(stab.emplace(std::move(s)).first) {}
    };
    Est-ce une mauvaise idée ?

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Pour la présence d'un couple iterator/const_iterator qui renvoie au même type d'iterator const, c'est à mon avis une question d'harmonisation des interfaces des conteneurs, ça augmente leur généralité.

    Pour le reste il me semble que tu te compliques un peu la vie mais je ne vois pas les tenants et aboutissants de ton idée.

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    cppreference.com dit une chose intéressante:
    iterator
    BidirectionalIterator (until C++11)
    Constant bidirectional iterator (since C++11)
    Il semble donc que iterator n'a pas toujours été constant.

  6. #6
    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
    Oui, de mémoire, la constance des données a été modifiée au cours du temps, car il y avait trop de soucis avec la version trop permissive.
    Pour le fait que insert retourne un iterator, comme tu la vois dans ton code, ça peut servir.
    Pour le fait qu'il en prenne un en paramètre, c'est pour une histoire d'optimisation : Si tu sais déjà à quel endroit l'objet doit être inséré (par exemple parce que tu as fait une recherche infructueuse de cet objet juste avant), et bien autant lui donner un indice pour qu'il trouve cet endroit plus vite, mais de toute manière, il l'insèrera de manière ordonné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.

Discussions similaires

  1. question sur les listes/set/vector
    Par deubelte dans le forum SL & STL
    Réponses: 11
    Dernier message: 04/01/2007, 20h41
  2. question sur les "set/list"
    Par deubelte dans le forum C++
    Réponses: 12
    Dernier message: 29/12/2006, 01h16
  3. question sur les listes/set/vector
    Par deubelte dans le forum SL & STL
    Réponses: 16
    Dernier message: 28/12/2006, 20h17
  4. Question sur set::set
    Par socrate dans le forum C++
    Réponses: 5
    Dernier message: 07/09/2006, 18h22
  5. question sur using std::
    Par d-a-v-e dans le forum SL & STL
    Réponses: 4
    Dernier message: 06/02/2006, 21h41

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