2010-01-20 4 views
3

У меня есть std::map<std::string, float>, поэтому я могу быстро искать значения float на основе имен, но теперь у меня есть ситуация, когда мне нужно найти следующее значение float в списке, как если бы оно было отсортировано численно. Насколько я знаю, я не могу просто использовать итератор, так как карта сортируется по ключевым словам. Так что, если мой набор содержит:Следующее значение в 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> 

Если я хочу, чтобы найти следующее значение после «тройки», что было бы наиболее эффективный способ сделать это? Ожидаемый результат в этом случае будет 4,0. Я могу перебрать весь список и сохранить максимальное значение вместе с текущим следующим значением. Это лучший способ?

+0

Спасибо за редактирование, Prasoon. Я забыл сделать код кода. :) –

ответ

6

Возможно, вы захотите использовать вместо обычной карты Boost::bimap - она ​​предоставляет эту возможность совершенно напрямую.

+1

Я бы, но не могу. Я не могу взять этот код в свою базу кода из-за ограничений лицензии. –

+0

Какие ограничения? Лицензия Boost была разработана таким образом, чтобы она действительно могла быть включена в любой проект, коммерческий или нет, и, вероятно, это самый разрешительный, который я знаю (прямо по BeerWare). –

+0

Лицензия Boost является одной из самых разрешительных, какая у вас проблема? –

1

Если вы действительно не можете использовать Boost, тогда вы можете сохранить отдельный набор поплавков рядом с картой (очень осторожно, чтобы синхронизировать их). Затем вы можете найти то, что хотите, с двумя поисковыми запросами:

set<float>::const_iterator found = set.find(map["Three"]); 
++found; 
assert(*found == 4.0); 
Смежные вопросы