按值迭代无序映射

时间:2018-11-22 15:55:55

标签: c++ c++11 unordered-map

我有一个奇怪的问题,我不知道是念念文档还是计算机做奇怪的事情。

我有一个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类没有比较运算符。造成这种情况的可能是我的广告订单吗?

1 个答案:

答案 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