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 :

Parcourir le résultat d'une multimap de la fin vers le début


Sujet :

SL & STL C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Parcourir le résultat d'une multimap de la fin vers le début
    Bonjour à tous,


    Je suis en train d'implémenter le pattern Observer mais j'ai un gros soucis :

    - Mon conteneur est une multimap.

    1) Une de mes données change.
    2) Celle-ci parcours sa liste d'écouteurs pour les notifier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    pair<multimap<Object*, Listener*>::iterator, multimap<Object*, Listener*>::iterator> range = mapListeners.equal_range(pObjectChanged);
    for(pair<multimap<Object*, Listener*>::iterator it = range.first; it != range.second; ++it)
    {
       it->second->NotifyChanged(it->first);
    }
    3) Une écouteur, d'après le changement de cette donnée, n'a plus besoin d'écouter, il se retire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void Listener::NotifyChanged(Object* pObject)
    {
        if(pObject->GetRefId() != m_Id)
       {
           // Je ne référence plus cet objet, c'est terminé entre nous
           // Suppression du pointeur dans ma liste interne
           // Débranchement auprès de l'écouteur car ça n'a plus lieu d'être
       }
    }
    -> Plantage car l'étape 2 commence une itération, il lance le premier évènnement, mais la réception de l'évennement provoque le retrait de l'élément concerné de la liste des écouteurs, donc lorsque j'incrémente l'itérateur du vector, ça plante.

    Est-ce que si je pars de la fin vers le début en décrémentant mon itérateur ça pourrai fonctionner ?
    J'aimerai bien tester mais je n'ai pas trouvé comment il fallait utiliser un reverse_iterator sur un multimap...

    Pouvez-vous m'aiguiller ?


    Merci

    A bientôt

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 341
    Points : 36 861
    Points
    36 861
    Par défaut
    Je suppose qu'il n'y a pas de threads.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    pair<multimap<Object*, Listener*>::iterator, multimap<Object*, Listener*>::iterator> range = mapListeners.equal_range(pObjectChanged);
    for(pair<multimap<Object*, Listener*>::iterator it = range.first; it != range.second; ++it)
    {
       it->second->NotifyChanged(it->first);
    }
    Va activer le listener... qui va le désabonner.
    => l'iterator ne sera plus consistant après que la multimap a été mise à jour.

    Vous pouvez parcourir la multimap dans n'importe quel sens: ca plantera toujours ou parfois mais c'est pas très propre.

    Oublions threads et mutex... je ne vois pas trop comment faire cela sans dissocier "parcourir la multimap" et "notifier les objets trouvés" via une liste d'objets intermédiaire: remplie lors du parcours de la multimap et utilisée pour notifier les objets trouvés.

    Mais d'autres auront peut être une meilleure idée.
    - W

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Bah finalement je me suis déclaré un itérateur en tant que membre privé de ma classe.

    Je l'utilise pour parcourir ma liste, et dans le retrait d'un élément (puisque le erase() renvoi l'itérateur du prochain élément)

    Donc à la suppression ça incrément l'itérateur et dans ma boucle, l'itérateur est déjà au suivant. Un petit test supplémentaire en fin de boucle et c'est réglé.

    Mais je reviendrais là dessus car je trouve pas ça très propre.


    Merci

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    std::reverse_iterator te permet d'inverser n'importe quel itérateur.

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968

Discussions similaires

  1. Parcourir un résultat d'une commande avec Java StringBuffer
    Par cisco.nat dans le forum Général Java
    Réponses: 2
    Dernier message: 29/05/2013, 11h09
  2. Réponses: 2
    Dernier message: 04/06/2009, 14h49
  3. [MySQL] sql:afichage du résultat de la fin vers le début
    Par hammag dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/05/2009, 15h02
  4. [PEAR] Parcourir le résultat d'une requête
    Par Katachana dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 25/01/2008, 14h13
  5. parcourir une liste de la fin vers le début
    Par zdra dans le forum SL & STL
    Réponses: 12
    Dernier message: 06/02/2005, 18h40

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