std :: unordered_map :: begin(int n)行为

时间:2012-04-26 14:29:03

标签: 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 << e.first << std::endl;

打印:

242
342
42
142

现在,我可以使用um.begin()->firstum.begin(0)->first访问242。可以使用um.begin(1)->first访问342。但um.begin(2)->firstum.begin(3)->first会导致程序崩溃。根据不同的数字,我可以访问um.begin(2)->first。 我无法向自己解释这种行为。我使用um.begin(int)错了吗?

1 个答案:

答案 0 :(得分:13)

你真的很困惑。 begin(1)是一种非常特殊的结构,仅用于访问基础哈希表结构中特定存储桶的无序容器,并返回本地迭代器。这与以某种“随机访问”方式访问任何特定元素无关,这是你根本无法做到的。

您可以使用无序容器进行迭代,遍历整个集合或按键find特定元素。这些元素无法按任何特定顺序访问,因此名称为“无序”。

可以使用本地迭代器迭代每个存储桶[begin(n), end(n)),但当然您必须使用与任何范围相同的惯用语来处理空容器。可以使用bucket_count成员函数发现可用的存储桶总数。

请注意,在大多数情况下,您应该期望存储桶包含零个或一个元素。通过load_factor成员函数可以(并且可配置)每个桶的平均元素数。