#include "stdafx.h"
#include <unordered_map>
#include <iostream>
using namespace std;
typedef tr1::unordered_map<int, int>MyMap ;
int _tmain(int argc, _TCHAR* argv[])
{
MyMap PolicyMap;
PolicyMap.insert(Myap::value_type(0, 10));
PolicyMap.insert(Myap::value_type(1, 20));
PolicyMap.insert(Myap::value_type(2, 30));
for (Myap::const_iterator i = PolicyMap.begin(); i != PolicyMap.end() ; i++)
{
cout << " [" << i->first << ", " << i->second << "]" << endl;
}
return 0;
}
为什么上面代码的输出是[0,10],[2,30],[1,20]。它应该是[2,30],[1,20],[0,10]。只有当我从零开始输入键值时才会发生这种情况,请帮助
答案 0 :(得分:2)
你错过了unordered_map
的观点。它不会像map
那样对元素进行排序,也不会将元素按照它们放入的顺序排列,它不能保证元素在底层结构中的顺序或者在使用迭代器时,将返回元素的顺序。
以上允许C ++实现使用更有效的底层结构(哈希表)。
答案 1 :(得分:2)
您目前正在滥用unordered_map
。此容器通告它不会以任何特定顺序保留其元素,因此结果不应该是意外的。
您应该使用(有序)std::map
代替:
#include <map>
#include <functional> // needed for std::greater<>
// The third template argument defines the sort direction for the map
// std::greater results in the map being ordered descending (and always by key)
typedef std::map<int, int, std::greater<int> > MyMap;