我有一个奇怪的问题,我不知道是念念文档还是计算机做奇怪的事情。
我有一个unordered_map。我想按存储桶顺序遍历unordered_map的存储桶。这部分很重要,因为我需要相对随机的访问权限。我在cplusplus.com上搜索,发现this。代码如下:
// unordered_map::bucket
#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
std::unordered_map<std::string,std::string> mymap = {
{"us","United States"},
{"uk","United Kingdom"},
{"fr","France"},
{"de","Germany"}
};
for (auto& x: mymap) {
std::cout << "Element [" << x.first << ":" << x.second << "]";
std::cout << " is in bucket #" << mymap.bucket (x.first) << std::endl;
}
return 0;
}
我期望在计算机上获得的输出是
Element [us:United States] is in bucket #1
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #2
Element [uk:United Kingdom] is in bucket #4
但是我得到的输出却按值类型排序,这很奇怪
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #1
Element [us:United States] is in bucket #1
我什至尝试用没有比较运算符的类替换该值,并且它仍然能够对它们进行排序。这与我的计算机存储地图的方式有关还是cplusplus.com过时了?我能够通过这样的循环遍历存储桶:
for ( unsigned int i = 0; i < b.bucket_count(); ++i) {
for ( hash_table::const_local_iterator image_iterator =
b.begin(i);image_iterator!= b.end(i); ++image_iterator ){
唯一的问题是我需要能够跳过一定数量的值,即我只希望每100个项目中就有1个项目需要复杂的循环且速度很慢。
任何帮助将不胜感激。我似乎无法弄清楚!
[编辑] 在我的代码中,我的unordered_map实际上是unordered_map,其中point是一个简单的类,只有两个成员变量,没有帮助函数。
当我在地图上运行以上循环时,这是我的输出。我已经链接了一个文本文件,因为它是一个很长的文件here 更让我困惑的是我的Point类没有比较运算符。造成这种情况的可能是我的广告订单吗?
答案 0 :(得分:3)
在std::unordered_map
中,特定元素的存储区完全由键上计算的哈希值决定,std::unordered_map
用作std::hash
的对应特化,作为默认哈希函数,即定义的实现,甚至不保证在不同的程序执行过程中都相同。参见std::hash。
正如@FrançoisAndrieux在评论部分中所述,std::unordered_map
的迭代顺序未指定,因此,您不能期望所有计算机都具有相同的迭代行为,例如,我计算机的输出为:
Element [de:Germany] is in bucket #0
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #4
Element [us:United States] is in bucket #4