这是我正在运行的代码,使用 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 。 342 可以使用 um.begin(1)->first 访问。但是 um.begin(2)->firstum.begin(3)->first 会使程序崩溃。使用不同的数字,我能够访问 um.begin(2)->first
我无法向自己解释这种行为。我使用 um.begin(int) 错了吗?

最佳答案

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

对无序容器所能做的就是迭代整个集合或 find 一个特定的键。元素不能以任何特定顺序访问,因此名称为“无序”。

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

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

10-07 12:59
查看更多