C++ 按值迭代的无序映射
我有一个奇怪的问题,我不知道我是否错过了阅读文档或我的计算机正在做一些奇怪的事情 我有一张无序的地图。我想按桶的顺序迭代无序_映射的桶。这部分很重要,因为我需要相对随机的访问。我在cplusplus.com上搜索,找到了。代码如下:C++ 按值迭代的无序映射,c++,c++11,unordered-map,C++,C++11,Unordered Map,我有一个奇怪的问题,我不知道我是否错过了阅读文档或我的计算机正在做一些奇怪的事情 我有一张无序的地图。我想按桶的顺序迭代无序_映射的桶。这部分很重要,因为我需要相对随机的访问。我在cplusplus.com上搜索,找到了。代码如下: // unordered_map::bucket #include <iostream> #include <string> #include <unordered_map> int main () { std::unorde
// 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 [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 ){
for(无符号整数i=0;i
唯一的问题是,我需要能够跳过一定数量的值,即每100个值只需要1个项目,这需要复杂的循环,而且速度很慢
任何帮助都将不胜感激。我似乎无法理解这一点
[编辑]
在我的代码中,我的无序映射实际上是无序映射,其中point是一个简单的类,只有两个成员变量,没有辅助函数
当我在地图上运行上面的循环时,这里是我的输出。我链接了一个文本文件,因为它是一个相当长的文件
更让我困惑的是,我的Point类没有比较运算符。这可能是我的插入顺序造成的吗?在
std::unordered_map
中,特定元素的bucket完全由在键上计算的哈希值决定,std::unordered_map
用作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
请注意,您的输出也按键类型排序,也按bucket排序,但以模运算从
#2
开始。据我所知,在std::unordered_map
上迭代时,元素的顺序是未指定的。我理解为什么您可能希望它按bucket排序,但我不知道有什么值得注意的是的。显然这不是这里发生的事情。不清楚您指的是什么文档。没有指定遍历无序映射的顺序,因此任何文档都不应该给出。这只是巧合。我可以使用您显示的特定键进行复制,但将它们更改为“a”
,“b”
,“c”
,“d
”和(按键或按桶).Unordered map是无序的。@MichaelHonaker底线是你不能依赖Unordered\u 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