typedef std::pair<unsigned int, int > KEY;
std::map<KEY, int> mapTest;
void FuncTest()
{
auto FnInsert = [&](unsigned int key01, int key02, int value)->void
{
KEY key = std::make_pair(key01, key02);
mapTest[key].insert(value);
};
for (int i = 0; i < 10; ++i)
{
if (i == 5)
continue;
FnInsert(i, i + 1, i + 2);
}
auto FnSearchByKey01 = [&](unsigned int keyFirst)->std::unordered_set<int>
{
KEY key01 = std::make_pair(keyFirst, 0); // 用作从左至右的查询
KEY key02 = std::make_pair(keyFirst, std::numeric_limits<int>::max()); // 用作从右至左的查询
auto lit = mapTest.lower_bound(key01);
auto rit = mapTest.upper_bound(key02);
std::unordered_set<int> resSet;
for (auto it = lit; it != rit; ++it)
{
// 这里就是找到的结果了。
resSet.insert(it->second.begin(), it->second.end());
}
return std::move(resSet);
};
}
原理是:
std::map是排序的,而如果key是一个pair的话,先根据pair的key1排序,里面的再根据key2排序。
当只知道pair中一个key的情况下,可以用lower_bound/upper_bound来取值
lower_bound找到的是第一个元素的前一个元素,upper_bound是相反的,所以当连个查到的结果相同的时候,就是没有找到,否则,他们结果区间的值就是想要找到的值了
用作一些特殊的场合,比较方便。