使用std::lower_bound
andstd::upper_bound
正是为了这个。
更好的是std::map::equal_range
结合了两者的力量:
在http://liveworkspace.org/code/d3a5eb4ec726ae3b5236b497d81dcf27上实时查看
#include <map>
#include <iostream>
const auto data = std::map<int, std::string> {
{ 1 , "Test1" },
{ 5 , "Test2" },
{ 10 , "Test3" },
{ 20 , "Test4" },
{ 50 , "Test5" },
};
template <typename Map, typename It>
void debug_print(Map const& map, It it)
{
if (it != map.end())
std::cout << it->first;
else
std::cout << "[end]";
}
void test(int key)
{
auto bounds = data.equal_range(key);
std::cout << key << ": " ; debug_print(data, bounds.first) ;
std::cout << ", " ; debug_print(data, bounds.second) ;
std::cout << '\n' ;
}
int main(int argc, const char *argv[])
{
test(1);
test(2);
test(24);
test(50);
}
输出:
1: 1, 5
2: 5, 5
24: 50, 50
50: 50, [end]