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

SL & STL C++ Discussion :

set et accès aux données


Sujet :

SL & STL C++

Vue hybride

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Par défaut set et accès aux données
    Bonjour,

    Je teste pour la première fois un set et je suis confronté à un problème idiot : je ne peux accéder à mes objets qu'à travers un iterator ( [] n'existe pas en set ) et en plus, je peux pas faire .begin() + ieme...
    Heureusement, il y a find mais si on veut le ieme élément du set que l'on a choisi parce qu'il permet d'ordonner les objets, on fait comment? (sans connaitre sa clef donc)

    encore un truc, &* d'un iterator semble retourner un cont obj* ... et du coup mes méthodes non const n'en veulent pas. Je suis obligé de passer par un pointeur intermédiaire?

    Merci d'avance

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par DEVfan Voir le message
    Je teste pour la première fois un set et je suis confronté à un problème idiot : je ne peux accéder à mes objets qu'à travers un iterator ( [] n'existe pas en set ) et en plus, je peux pas faire .begin() + ieme...
    Heureusement, il y a find mais si on veut le ieme élément du set que l'on a choisi parce qu'il permet d'ordonner les objets, on fait comment? (sans connaitre sa clef donc)
    std::set n'est pas fait pour ça, si c'est quelque chose que tu as besoin, peut-être qu'un std::vector trié avec std::sort serait plus approprié.

    encore un truc, &* d'un iterator semble retourner un cont obj* ... et du coup mes méthodes non const n'en veulent pas. Je suis obligé de passer par un pointeur intermédiaire?
    Les itérateurs c'est comme les pointeurs, il en existe des const et des non-const. &* d'un itérateur non-const retourne un obj*.

  3. #3
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Autre proposition : itérateur (const ou pas selon ce que tu veux en faire) sur ton std::set + utilisation de std::advance sur ton itérateur.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut std::set : éléments constants
    Les objets d'un std::set sont constants, parce que :
    • la clef, par nature, est constante
    • dans un set, la clef = l'élément

    Pour modifier un élément, tu peux le supprimer et en insérer un autre modifié.

    En modifiant un élément, en général, tu pourrai modifier l'ordre des éléments et casser le set.

    Si tu es sûr que ta modification ne risque pas de faire cela, il y a des parades à const (mais il faut comprendre pourquoi on a une erreur avant de la contourner).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 167
    Par défaut
    OK, je comprends que ce soit pas dans la logique du set d'autoriser des modifs.

    Faire un vector et sort... c'est ce que je faisais avant mais je devais refaire le sort souvent ... et d'après le diagramme des choix conteneurs.... ça me paraissait judicieux.
    En fait, pourquoi ça ne me dérangerait pas de pouvoir modifier un peu mes objets contenus... parce que je trie mon set par un prédicat qui regarde 1 paramètre de mon objet et que je modifie un paramètre qui n'a rien à voir. Mais qui ne peut être const puisqu'il modifie....
    Ma seule alternative pour garder le set, c'est donc de faire une méthode retournant un nouvel objet et de remplacer celui qui possède la même clef... c'est bien ça?!

  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
    Il y a deux possibilités classiques :
    Tu enlèves ton élément du set, tu le modifies, tu le remets.
    Tu remplace ton set par une map, dans la clef, tu mets seulement la partie qui compte, dans la valeur, tu mets ton objet (a toi de voir s'il contient alors encore la partie qui compte).
    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.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par DEVfan Voir le message
    En fait, pourquoi ça ne me dérangerait pas de pouvoir modifier un peu mes objets contenus... parce que je trie mon set par un prédicat qui regarde 1 paramètre de mon objet et que je modifie un paramètre qui n'a rien à voir. Mais qui ne peut être const puisqu'il modifie....
    Déjà, tu as compris le principe du conteneur associatif ordonné.

    Ce const là est un peu une mesure anti-neuneux, dont tu ne fais pas partie, d'après le paragraphe précédant.

    Citation Envoyé par DEVfan Voir le message
    Ma seule alternative pour garder le set, c'est donc de faire une méthode retournant un nouvel objet et de remplacer celui qui possède la même clef... c'est bien ça?!
    Non, il y a les parades que j'ai évoqué.

    Mais avant, as-tu envisagé d'utiliser un map? Est-ce inadéquat, mal-pratique?

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

Discussions similaires

  1. [Hibernate]Accès aux données BDD via Hibernate
    Par LESOLEIL dans le forum Hibernate
    Réponses: 8
    Dernier message: 17/05/2005, 20h39
  2. [SGBD]Optimiser le temps d'accès aux données (schéma BD)
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 08/10/2004, 18h33
  3. [débutant] avoir accès aux données de la base BCDI 3
    Par Valichou dans le forum Bases de données
    Réponses: 7
    Dernier message: 06/05/2004, 13h13
  4. accès aux donnée d'un DBGRID
    Par relax_06 dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/03/2004, 23h06
  5. [TDataModule] Intérêt de séparer les accès aux données?
    Par Cornell dans le forum Bases de données
    Réponses: 5
    Dernier message: 05/09/2003, 16h42

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