Map 为什么我的无序地图会自行排序?

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

所以我在玩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";
    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