最近写项目时,发现map自动排序了,以前没注意这个问题,可能ms考虑到map查询效率问题,插入时候就自动按key排序,查找其内部构造,发现其是模板实现方式,咱们可以改一改模板就可以避免自动排序(万不得已才用,数据大不建议)
如果要屏蔽掉map的自带默认排序,我们需要重写以一个排序对象
#include <map>
#include <iostream>
template<class T>
struct DisableCompare : public std::binary_function<T, T, bool>
{
bool operator()(T lhs, T rhs) const
{
if (lhs == rhs)
return false;
return true;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::map<int, wstring,DisableCompare<int>> myMap;
myMap.insert(std::make_pair(2, L"ABC1"));
myMap.insert(std::make_pair(6, L"ABC2"));
myMap.insert(std::make_pair(8, L"ABC3"));
myMap.insert(std::make_pair(9, L"ABC4"));
myMap.insert(std::make_pair(1, L"ABC5"));
//也可以用下列模式插入
//myMap[1]=L"ABC5";
//myMap[12]=L"ABC121";
auto it = myMap.begin();
for (; it != myMap.end(); it++)
{
std::cout << it->first << std::endl;
}
return 0;
}
特别说明:
map底层是红黑树实现的,它的设计本就是按照插入值的大小来进行排序的,以加快查找速度,本文这样处理是违背了它的设计原则,所以在vs2013及以后版本,debug模式下,它会报错,release是正常的。