2010-01-20 4 views
3

J'ai un std::map<std::string, float> donc je peux faire des recherches rapides pour les valeurs flottantes basées sur les noms, mais j'ai maintenant une situation où je dois trouver la valeur flottante suivante dans la liste comme si elle était triée numériquement. Je ne peux pas utiliser un itérateur, autant que je sache, puisque la carte est triée par clé. Donc, si mon jeu contient:Valeur suivante dans std :: map

std::pair<"One", 1.0> 
std::pair<"Two", 2.0> 
std::pair<"Three", 3.0> 
std::pair<"Four", 4.0> 
std::pair<"Five", 5.0> 

Si je veux trouver la valeur suivante après « Trois », ce serait la façon la plus efficace de le faire? La sortie attendue dans ce cas serait de 4,0. Je peux itérer sur toute la liste et stocker la valeur maximale avec la valeur suivante actuelle. Est-ce la meilleure façon?

+0

Merci pour l'édition, Prasoon. J'ai oublié de faire le code des blocs de code. :) –

Répondre

6

Vous souhaitez probablement utiliser un Boost::bimap au lieu d'une carte normale - il offre cette possibilité de manière très directe.

+1

Je le ferais, mais je ne peux pas. Je ne peux pas prendre ce code dans ma base de code en raison de restrictions de licence. –

+0

Quelles restrictions? Boost Licence a été conçu de manière à pouvoir être inclus dans n'importe quel projet, commercial ou non et est probablement le plus permissif que je connaisse (tout au long de la BeerWare). –

+0

La licence Boost est l'une des plus permissives, quel problème avez-vous avec elle? –

1

Si vous ne pouvez vraiment pas utiliser Boost, vous pouvez conserver un ensemble distinct de flottants le long de la carte (en prenant soin de les synchroniser). Ensuite, vous pouvez trouver ce que vous voulez avec deux recherches:

set<float>::const_iterator found = set.find(map["Three"]); 
++found; 
assert(*found == 4.0); 
Questions connexes