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 :

Mise à jour d'une clé dans un multimap


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut Mise à jour d'une clé dans un multimap
    Bonjour à toutes et à tous,

    J'aimerai savoir s'il est possible de modifier la valeur d'une clé identifiant un objet dans une multimap ?

    A titre d'exemple, j'aimerai avoir un conteneur de N objets tous instanciés (mais pas initialisés) et insérés (avec une clé de type entier et égale à -1) dans mon conteneur au démarrage de mon application.

    La valeur de clé = -1 me permet d'identifier les objets non initialisés.

    Lorsque j'ai besoin d'un objet, je récupère de ma multimap le premier objet identifier par la clé -1, j'initialise son contenu et change sa clé.

    Tous les objets non initialisés ont la même clé, -1.
    Tous les objets initialisés ont une clé unique comprise entre 0 et N-1.

    Le choix de mon conteneur s'est fait sur les critères suivants :
    * pas d'ordre
    * objets identifiés par une clé
    * clé et objet séparés
    * nécessité d'accéder à un objet à partir de sa clé

    Si je souhaite pouvoir modifier la clé d'un objet existant c'est que je préfère me passer de la création d'objet en cours d'utilisation de mon application.

    D'avance merci pour vos différents éléments de réponse.

    Cordialement.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    A priori, la seule facon de changer la clef d'un élément d'un conteneur trié, c'est d'enlever l'élément, de changer sa clef, et de le remettre. La raison, c'est que le multimap, ou le map, utilise la clef pour "ranger" l'élément. Si tu changes la clef, l'élément change de place.

    Maintenant, à lire la description de ton problème, je pense que tu fonctionnerais mieux avec deux conteneurs : une pile et un vecteur (en fait, deux vecteurs : il n'y a pas vraiment de différence entre une pile et un vecteur, en STL)

    Si je comprends bien, tes objets initialisés ont des index uniques et séquentiels (le premier s'appelle 0, le second 1, etc...). Il te suffit de les mettre sur un vector<>, quand tu ajoutes le n-ieme, tu fais un push_back, et tu le retrouveras en position vect[n], donc avec sa "clef" (qui est en fait son numéro d'ordre).

    Tes non initialisés, tu vas les empiler sur une pile, au démarrage, et quand tu en as besoin d'un, tu le dépiles (pop), tu l'initialises, et tu l'empiles sur le vecteur (push_back).

    Ce schéma de prendra moins de mémoire et moins de code. La seule chose à retenir, c'est que sur une pile, tu prends, quand tu as besoin d'un non initialisé, le dernier de la pile (celui au sommet). Si tu as besoin de le faire dans l'autre sens, une liste ou un deque feront l'affaire.

    Francois
    Dernière modification par Invité ; 20/02/2010 à 22h21.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut
    Salut !

    Merci pour ta réponse, je vais essayer ça.

    Faut encore que je vérifie mais ce n'est pas certains que les identifiants soient séquentiels justement ... à priori il ne sont pas nécessairement obligé de se suivre alors si c'est le cas, pour le vecteur c'est mort

  4. #4
    Invité
    Invité(e)
    Par défaut
    Si les identifiants restent uniques, mais ne arrivent en ordre dispersé alors une map est la solution la plus simple.

    S'ils sont ordonnés (ie il y a des trous, mais tu les reçois en ordre croissants, ou presque croissants), l'option vector demeure, mais il faudra utiliser une recherche dichotomique pour trouver les clef (fonctions lower_bound de la STL), ca reste O(lg n) comme les map, mais ca prend moins de place.

    En tous cas, la séparation des initialisés et des non initialisés en deux tas devrait simplifier le système

    Francois

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Par défaut
    Merci pour ta réponse.

    Les choses sont plus claires maintenant.


Discussions similaires

  1. [AC-2003] mise à jour d'une ligne dans le cas des doublon
    Par radahm dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 11/06/2009, 08h30
  2. Mise à jour d'une comboBox dans Visual Studio
    Par lilimilou29 dans le forum VB.NET
    Réponses: 7
    Dernier message: 31/05/2007, 17h04
  3. Mise à jour d'une date dans MySQL
    Par champijulie dans le forum JDBC
    Réponses: 6
    Dernier message: 07/02/2007, 17h02
  4. [MySQL] mise à jour d'une date dans une table
    Par jophp dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/10/2006, 20h48
  5. Mise à jour d'une table dans 2 BDD
    Par bozolozo dans le forum Access
    Réponses: 4
    Dernier message: 21/04/2006, 16h55

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