4

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

4

1 回答 1

13

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

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

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

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

于 2012-04-26T14:37:06.433 回答