我必须学习哈希地图实现。我研究过它会根据模板中提到的顺序对元素进行排序。示例代码是:
#include <hash_map>
#include <iostream>
using namespace std;
int main()
{
typedef pair <int, int> Int_Pair;
hash_map <int, int>::iterator hmp1_Iter;
hash_map <int, int , hash_compare <int, less<int> > > hmp1;
hmp1.insert(Int_Pair(1, 13));
hmp1.insert(Int_Pair(3, 51));
hmp1.insert(Int_Pair(7, 22));
hmp1.insert(Int_Pair(2, 31));
cout<<"\nOperation1: hash_map<int, int, \nhash_compare<int, less<int> > > hmp1\n";
cout<<"Operation2: hmp1.insert(Int_Pair(1, 13))...\n";
cout<<"hmp1 data: ";
for(hmp1_Iter = hmp1.begin(); hmp1_Iter != hmp1.end(); hmp1_Iter++)
cout<<hmp1_Iter->first<<":"<<hmp1_Iter->second<<" ";
cout<<endl;
return 0;
}
预期的代码结果是:1:13 2:31 3:51 7:22 但它是1:31 3:51 7:22 2:31。但是应该按升序排列关键元素。请解释为什么会发生这种情况?
答案 0 :(得分:2)
std::hash_map
是一个无序的关联容器,通常用哈希表实现(密钥的哈希作为链表列表中的索引)
如果您需要“有序哈希地图”,则可以使用std::map
。它通常是一棵红黑树,它的关键元素可以按升序迭代。
std::hash_map
的速度应该比std::map
快。
答案 1 :(得分:1)
来自MSDN的hash_map Class
网站受控序列中元素的实际顺序取决于 哈希函数,排序函数和哈希的当前大小 表存储在容器对象中。你无法确定当前 哈希表的大小,所以你不能一般预测的顺序 受控序列中的元素。
简单地说,hash_map中元素的顺序永远不会保证是有序的,它们看起来按顺序排列的任何情况都只是巧合。
为了使这一点更加清晰,the MSDN website注意到
此API已过时。替代方案是unordered_map Class。
提供更多证据证明hash_map从不打算在其元素上提供任何顺序。