C++ std::无序映射::开始(int n)行为

C++ std::无序映射::开始(int n)行为,c++,stl,c++11,unordered-map,C++,Stl,C++11,Unordered Map,下面是我正在运行的代码,使用g++4.6和-std=c++0x std::unordered_map<int, int> um; um.insert(std::make_pair(42, 43)); um.insert(std::make_pair(342, 343)); um.insert(std::make_pair(142, 143)); um.insert(std::make_pair(242, 243)); for(auto e : um) std::cout <

下面是我正在运行的代码,使用g++4.6和
-std=c++0x

std::unordered_map<int, int> um;

um.insert(std::make_pair(42, 43));
um.insert(std::make_pair(342, 343));
um.insert(std::make_pair(142, 143));
um.insert(std::make_pair(242, 243));

for(auto e : um)
std::cout << e.first << std::endl;
现在我可以使用
um.begin()->first
um.begin(0)->first
访问242。可以使用
um.begin(1)->first访问342。但是
um.begin(2)->first
um.begin(3)->first
会使程序崩溃。使用不同的号码,我可以访问
um.begin(2)->first

我无法向自己解释那种行为。我是否使用
um.begin(int)
错误

你对此非常困惑
begin(1)
是一种非常特殊的构造,仅适用于访问底层哈希表结构中特定bucket并返回本地迭代器的无序容器。这与以某种“随机访问”方式访问任何特定元素无关,而这是您无法做到的

使用无序容器所能做的就是遍历整个集合,或者按键查找特定元素。元素不能以任何特定的顺序访问,因为名称为“无序”

您可以使用本地迭代器迭代每个bucket
[begin(n),end(n))
,但当然您必须使用与处理空容器的任何范围相同的习惯用法。可用的bucket总数可以通过
bucket\u count
成员函数查找


请注意,在大多数情况下,您应该期望一个bucket包含零个或一个元素。每个bucket的平均元素数是可用的(并且是可配置的)通过
load\u factor
成员函数。

非常感谢您的澄清!我对使用
int
表示怀疑。它更可能是一种
size\u类型
internal typedef,指的是
std::size\u t
@MatthieuM。您是对的。但变化不大
242
342
42
142