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 :

Modifier un set


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 18
    Par défaut Modifier un set
    Bonjour à tous,
    Jeune développeur à mes heures perdues, j'ai rencontré hier un problème de taille.
    En effet, j'aimerais directement modifier des objets déjà présents dans un set.
    J'ai donc d'abord tenté d'utiliser un itérateur qui s'arrête à la position souhaitée, et utilise ensuite les méthodes de la classe pour modifier ledit objet de la façon "classique" it->methode(parametres). Malheureusement, cela ne semble pas possible car les itérateurs sont des objets utilisés en lecture uniquement. Plus généralement, un bloc du style *it=2; ne va pas fonctionner.
    J'ai vaguement lu quelque chose à propos de "output iterator tag", qui pourrait peut être offrir la possibilité à l'itérateur d'effectuer des modifications, mais j'avoue que je n'y ai pas compris grand chose.
    L'autre idée que j'ai eue, est d'utiliser des pointeurs. Seulement, je ne vois pas commencer effectuer un parcours de set avec un simple pointeur, ou bien comment faire pointer ce pointeur sur l'objet pointé par l'itérateur.
    Je vous serai très reconnaissants de m'apporter un peu d'aide à mon problème
    Merci d'avance !

  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
    La raison pour laquelle il n'est pas possible de modifier directement un set, c'est que cela briserai à la fois l'unicité et le tri.

    Suppose le set std::set<int> set = {2, 6, 8, 9}.
    Que se passe-t-il si tu fais l'équivalent de *(++ ++ (set.begin()))=N. On a bien un itérateur sur 8.

    on appelle successivement begin, iterator::operator++, iterator::operator*, et enfin l'opérateur primitif int:operator= int.

    Pour N = 7, tout va bien.
    Pour N = 4, il faut modifier l'arbre interne, pour déplacer cet int entre 2 et 6.
    Pour N = 2, il faut carrément enlever le 8.
    sauf que ca n'est possible à gérer que si le operator* ne retourne pas un int&, mais un proxy. Une classe qui serait le plus transparent possible, mais qui redéfinirait tous les opérateurs.

    Continuons avec *(++ ++ (set.begin())) = 2 = 8.
    La ca devient drole, j'ai une suppression, puis un déplacement et rééquilibrage de l'arbre.
    Cette instruction est en fait équivalente à set.remove(2).


    Là où ca devient vraiment grave, c'est que si tu as un itérateur modifiant, l'utilisation de std::sort devient possible, et qu'au lieu de trier, cela va vider ton set d'une bonne partie.
    Et là, même le proxy n'est plus suffisant.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 18
    Par défaut
    C'est vrai que je n'ai pas eu cette réflexion. Il vaut donc probablement mieux utiliser d'autres types de données, comme un simple vecteur ?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 307
    Par défaut
    Un vecteur c'est bien c'est souvent le plus simple mais attention la suppression est en o(n), mais dans tous les cas un vecteur sera efficace si n n'est pas très grand (si n < 100 un vecteur c'est très bien).
    L'autre solution serait de faire un remove puis un insert dans ton set.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2015
    Messages : 18
    Par défaut
    Citation Envoyé par renoo Voir le message
    Un vecteur c'est bien c'est souvent le plus simple mais attention la suppression est en o(n), mais dans tous les cas un vecteur sera efficace si n n'est pas très grand (si n < 100 un vecteur c'est très bien).
    L'autre solution serait de faire un remove puis un insert dans ton set.
    Mon vecteur ne sera pas très grand (une vingtaine d'objets), en revanche il risquerait d'y avoir beaucoup de remove/insert. Je vais tenter avec le vecteur !
    Merci pour vos réponses !

  6. #6
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 736
    Par défaut
    Si tu as beaucoup d'insertions et de suppressions, un std::list est à envisager.

    Plus généralement pour choisir un container, il y a toute une série de questions à se poser résumées par cette image.

Discussions similaires

  1. [Character SET] Modifier un caractére
    Par ducho dans le forum Oracle
    Réponses: 5
    Dernier message: 24/03/2014, 16h50
  2. modifier le settings ISPF en REXX
    Par qqoos dans le forum z/OS
    Réponses: 6
    Dernier message: 19/11/2009, 13h25
  3. Comment modifier Properties.Settings ?
    Par Sunsawe dans le forum C#
    Réponses: 3
    Dernier message: 02/08/2007, 14h37
  4. [9i] Modifier character set d'une bdd
    Par user_oracle dans le forum Oracle
    Réponses: 9
    Dernier message: 22/02/2006, 12h08
  5. [Oracle9i] modifier le character set d'une bd?
    Par osmoze dans le forum Oracle
    Réponses: 8
    Dernier message: 16/02/2005, 13h29

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