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 :

Recherche d'une clef dans une map dans un range donné.


Sujet :

C++

  1. #1
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut Recherche d'une clef dans une map dans un range donné.
    Bonjour.

    Je stocke des (cléf/valeur)s dans une std::map. J'ai un traitement qui s'intéresse à une clef et à ses voisines.

    Je cherche le meilleur moyen de récupérer un itérateur sur des clefs voisines sans avoir à faire un map->find() pour chaque voisine.

    Je pensais pouvoir faire une recherche en spécifiant une plage, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int clef_triees[7] = {4, 6, 13, 16, 18, 24, 40};
     
    // je dispose d'un iterateur initial sur la clef 16 : it_init
     
    it_13 = map->find(13, map->begin(), it_init - 1);
    it_6 = map->find(6, map->begin(), it_13 - 1);
    it_4 = map->find(4, map->begin(), it_6 - 1);
     
    it_18 = map->find(18, it_init + 1, map->end());
    it_24 = map->find(24,it_18 + 1, map->end());
    it_40 = map->find(40, it_24 + 1, map->end());
    Si la recherche est dochotomique cela peut faire gagner un peu de temps. Mais je ne trouve pas de fonction qui permette de faire ça.

    Je me demande si c'est utile de vouloir optimiser cela, et si oui comment le faire ?

  2. #2
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonjour.
    Je pense que pour cela, il faudrait utiliser un std::vector trié, plutôt qu'une map.
    (Tien, il me semble avoir vu ça dans Folly)

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par valefor Voir le message
    J'ai un traitement qui s'intéresse à une clef et à ses voisines.
    Bonjour,
    Je ne suis pas bien sur de comprendre exactement ce que désigne les "voisines d'une clé". Est-ce que le code suivant correspond ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::map<int, int>::iterator it_init = m.find(16);
    std::map<int, int>::iterator it_18 = std::next(it_init, 1);
    std::map<int, int>::iterator it_13 = std::prev(it_init, 1);
    std::map<int, int>::iterator it_24 = std::next(it_init, 2);
    std::map<int, int>::iterator it_6  = std::prev(it_init, 2);
    Remarque : le code ci-dessus nécessite un compilateur relativement récent (C++11). Sur des compilateurs plus vieux il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::map<int, int>::iterator it_6 = it_init;
    std::advance(it_6, -2);

  4. #4
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Bonjour,
    Est-ce que le code suivant correspond ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::map<int, int>::iterator it_init = m.find(16);
    std::map<int, int>::iterator it_18 = std::next(it_init, 1);
    std::map<int, int>::iterator it_13 = std::prev(it_init, 1);
    std::map<int, int>::iterator it_24 = std::next(it_init, 2);
    std::map<int, int>::iterator it_6  = std::prev(it_init, 2);
    Non, cela ne convient pas car je ne sais pas combien de paires ont été insérées entre la clef 16 et 13 par exemple. Ce sont des voisines au sens géographiques car ces cléf représentent des lieux voisins sur une carte...

    En fait c'était sous mes yeux : lower_bound fait aussi l'affaire pour ça

    Désolé pour le bruit

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Il va te falloir faire en sorte que les voisines géographiques se retrouvent voisines au sens représentation en mémoire.
    Sinon, je ne vois pas par quel miracle tu peux réaliser ce genre d'opérations.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Bonjour,

    Il va te falloir faire en sorte que les voisines géographiques se retrouvent voisines au sens représentation en mémoire.
    Sinon, je ne vois pas par quel miracle tu peux réaliser ce genre d'opérations.
    Je pense qu'il s'agit de voisines au sens de la relation d'ordre utilisée sur les clés, et pas en mémoire.
    Find me on github

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Je pense qu'il s'agit de voisines au sens de la relation d'ordre utilisée sur les clés, et pas en mémoire.
    Tu joues sur les mots, mais oui c'est l'idée et c'est exactement ce que j'ai dit.

    Si dans ta map tes voisins géographiques ne sont pas voisins de clé, tu ne t'en sortiras jamais.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

Discussions similaires

  1. Recherche dans une chaîne des codes contenus dans une table
    Par funkyjul dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/07/2011, 08h28
  2. [Toutes versions] Recherche de données dans une feuille pour les copier dans une autre
    Par mattdogg97 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/02/2011, 14h22
  3. JPanel dans une JFrame ok, mais JPanel dans un JScrollPane dans une JFrame non :(
    Par FenX. dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 22/05/2008, 10h45
  4. [MySQL] récupérer dans une boucle chaque information MySQL dans une variable différente
    Par gtenthorey dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/05/2007, 22h34
  5. Réponses: 2
    Dernier message: 20/06/2006, 08h22

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