这是我正在运行的代码,使用 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)
错了吗?
最佳答案
你对此很困惑。 begin(1)
是一种非常特殊的构造,仅适用于访问底层哈希表结构中特定bucket 并返回本地迭代器。这与以一种“随机访问”方式访问任何特定元素无关,您根本无法做到这一点。
对于无序容器,您所能做的就是遍历整个集合或按键查找
特定元素。这些元素不能以任何特定顺序访问,因此名称为“无序”。
您可以使用本地迭代器迭代每个桶[begin(n), end(n))
,但是当然您必须使用相同的习语您使用任何范围来处理空容器。可以使用 bucket_count
成员函数发现可用桶的总数。
请注意,在大多数情况下,您应该期望一个桶包含零个或一个元素。每个桶的平均元素数可通过 load_factor
成员函数获得(并且可配置)。
关于c++ - std::unordered_map::begin(int n) 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10335527/