按值迭代的无序映射
Unordered map iterating by values
我有一个奇怪的问题,我不知道是我没有阅读文档还是我的计算机在做一些奇怪的事情。
我有一个 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
我什至尝试用没有比较运算符的 class 替换该值,但它仍然能够对它们进行排序。这与我的计算机存储地图的方式有关还是 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 是一个简单的 class,它只有两个成员变量,没有辅助函数。
当我 运行 我的地图上面的循环是我的输出。我链接了一个文本文件,因为它是一个很长的文件 here
更让我困惑的是我的 Point class 没有比较运算符。会不会是我的广告订单导致的?
在std::unordered_map
中,特定元素的桶完全由根据键计算的哈希值确定,std::unordered_map
用作std::hash
的相应特化作为默认哈希函数,这是实现定义的,甚至不能保证在不同的程序执行过程中是相同的。参见 std::hash。
正如@François Andrieux 在评论部分所说,未指定 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
我有一个奇怪的问题,我不知道是我没有阅读文档还是我的计算机在做一些奇怪的事情。
我有一个 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
我什至尝试用没有比较运算符的 class 替换该值,但它仍然能够对它们进行排序。这与我的计算机存储地图的方式有关还是 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 是一个简单的 class,它只有两个成员变量,没有辅助函数。
当我 运行 我的地图上面的循环是我的输出。我链接了一个文本文件,因为它是一个很长的文件 here 更让我困惑的是我的 Point class 没有比较运算符。会不会是我的广告订单导致的?
在std::unordered_map
中,特定元素的桶完全由根据键计算的哈希值确定,std::unordered_map
用作std::hash
的相应特化作为默认哈希函数,这是实现定义的,甚至不能保证在不同的程序执行过程中是相同的。参见 std::hash。
正如@François Andrieux 在评论部分所说,未指定 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