c++ - std::unordered_map::begin(int n) 行为

标签 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) 错了吗?

最佳答案

你对此很困惑。 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/

相关文章:

c++ - 将多个右值和左值传递给函数而不创建重载

c++ - 设置差异的输出可以存储在第一个输入中吗?

c++ - C++ 中的 static_cast complex<short> 到 complex<double>

c++ - 在空容器上调用时 std::partition 的行为?

c++ - 查找基类/父类(super class)成员的实现

c++ - 尝试运行内核代码时 OpenCL(意外)卡住

使用迭代器的 C++ 归并排序

c++ - 使用 OpenGL 的 2D Sprite 动画技术

c++ - 在 C++ 中实现可变排名表

c++ - 如何检查行中的第一个字符是否为#(注释的开头)