以下是我正在运行的代码,包含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()->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)
错了吗?
答案 0 :(得分:13)
begin(1)
是一种非常特殊的结构,仅用于访问基础哈希表结构中特定存储桶的无序容器,并返回本地迭代器。这与以某种“随机访问”方式访问任何特定元素无关,这是你根本无法做到的。
您可以使用无序容器进行迭代,遍历整个集合或按键find
特定元素。这些元素无法按任何特定顺序访问,因此名称为“无序”。
您可以使用本地迭代器迭代每个存储桶[begin(n), end(n))
,但当然您必须使用与任何范围相同的惯用语来处理空容器。可以使用bucket_count
成员函数发现可用的存储桶总数。
请注意,在大多数情况下,您应该期望存储桶包含零个或一个元素。通过load_factor
成员函数可以(并且可配置)每个桶的平均元素数。