2010-11-12 4 views
2

Actuellement, j'ai un tableau std::map <DWORD, DWORD> et je recherche une valeur de clé correspondant à une plage spécifique.Recherche d'une valeur de plage inférieure ou supérieure à la classe de conteneur

Par exemple:

Trouver une valeur clé de la carte dont la valeur doit être soit inférieure à 50 < ou supérieur à> 50 de la valeur de clé recherchée.

Si la valeur de clé recherchée a été 20 alors je veux une valeur clé de la gamme de carte-à-dire

-70.............20............+70 

est-il une meilleure façon de trouver une valeur clé autre que l'utilisation de deux boucles (d'abord pour moins de , deuxième pour plus de) ou un moyen approprié pour stocker des données de table pour une telle opération?

Répondre

5

Vous pouvez utiliser map::lower_bound et map::upper_bound pour cela, si vous connaissez la valeur de milieu de gamme initiale.

map<int, MyClass>::const_iterator lower = 
    myMap.lower_bound(-30); // or -70 if you prefer 
map<int, MyClass>::const_iterator upper = myMap.lower_bound(70); 

Les deux itérateurs doivent être vérifiés pour myMap.end() avant de déréférencement.

Cet extrait dépend du fait que votre commande soit l'ordre ascendant habituel - la commande personnalisée pourrait inverser cette valeur de sorte que les nombres -ve apparaissent après + ve. Il n'y a pas de meilleur moyen de le faire - en construisant le map comme un arbre binaire, ce sera efficace. Voir aussi les échantillons en ligne pour lower_bound et upper_bound.

Notez que DWORD est non signé, donc utiliser des nombres négatifs dans votre carte peut vous donner une erreur d'avertissement et -70 étant inopinément> 70.

+0

pour autant que je comprends qu'il veut op clés en recherchant les valeurs de La plage spécifique et 'map :: * _ bound' fonctionne pour les clés et non pour les valeurs – erjot

+0

@erjot - le libellé est ambigu mais la première phrase mentionne" valeur clé correspondant à une plage spécifique ". –

+0

et deuxième 'Trouver une clé de la carte quelle valeur devrait être»;) imho op devrait reconsidérer changer la structure de données qu'il utilise – erjot

Questions connexes