天天看点

std::map特性的小技巧

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是相反的,所以当连个查到的结果相同的时候,就是没有找到,否则,他们结果区间的值就是想要找到的值了
用作一些特殊的场合,比较方便。