Map 为什么我的无序地图会自行排序?
所以我在玩STL中新标准化的Map 为什么我的无序地图会自行排序?,map,c++11,unordered-map,Map,C++11,Unordered Map,所以我在玩STL中新标准化的unordered_map。我的代码有点像这样,我只是创建一个无序的_图,填充它,然后打印出来: unordered_map<int,string> m1; m1[5]="lamb"; m1[2]="had"; m1[3]="a"; m1[1]="mary"; m1[4]="little"; m1[7]="fleece"; m1[6]="whose"; m1[10]="fleecey
unordered_map
。我的代码有点像这样,我只是创建一个无序的_图,填充它,然后打印出来:
unordered_map<int,string> m1;
m1[5]="lamb";
m1[2]="had";
m1[3]="a";
m1[1]="mary";
m1[4]="little";
m1[7]="fleece";
m1[6]="whose";
m1[10]="fleecey";
m1[8]="was";
m1[9]="all";
for(unordered_map<int,string>::const_iterator i = m1.begin(); i != m1.end(); ++i)
cout<<i->first<<" "<<i->second<<endl;
但是我不想为订购我的地图而付出代价!这就是为什么我使用无序的地图。。。这是怎么回事
附加说明:我使用的是gcc版本4.3.4 20090804(release)1(gcc)
,我是这样编译的g++-std=c++0X maptest.cpp
“无序”并不意味着它将随机存储项目或维持您在地图中放置的顺序。这只是意味着你不能依赖任何特定的订单。您不需要为排序付出代价,恰恰相反——实现并没有显式地对项目进行排序,它是一个hashmap,并以它喜欢的任何方式存储其元素,这通常是一种非常高效的方式。碰巧的是,哈希算法和地图的其他内部工作,当在地图上精确地使用这些键和操作的数量和顺序时,最终以看起来有序的顺序存储项目。例如,字符串可能导致明显的随机布局
另一方面,这可能是由于映射使用一个将(至少一些)整数映射到自身的散列,并使用散列的低位(根据映射大小的要求)来确定底层数组的索引(例如,CPython可以做到这一点——通过一些非常巧妙的添加,可以相对简单而高效地处理冲突;出于同样的原因,CPython字符串和元组的散列是非常可预测的)。有趣的是,这里是libc++的输出,它还具有一个用于
std::hash
的标识函数
有几种方法可以实现散列容器,每种方法都有自己的折衷。可能,为了好玩,整数类型的散列函数会尝试将
m1[10]=“fleecey”
更改为类似m1[154297]=“fleecey”;
:)是的,它得到了所有的散列。谢谢
1 mary
2 had
3 a
4 little
5 lamb
6 whose
7 fleece
8 was
9 all
10 fleecey
9 all
8 was
10 fleecey
6 whose
7 fleece
4 little
1 mary
3 a
2 had
5 lamb