c ++中的Hashmap没有订购元素?

时间:2013-04-08 12:11:27

标签: c++ hashmap

我必须学习哈希地图实现。我研究过它会根据模板中提到的顺序对元素进行排序。示例代码是:

#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。但是应该按升序排列关键元素。请解释为什么会发生这种情况?

2 个答案:

答案 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从不打算在其元素上提供任何顺序。