hash_map会自动排序[C ++]吗?

时间:2010-10-05 15:55:19

标签: c++ hashmap

在下面的代码中,hash_map会自动排序或者按排序顺序插入元素。任何想法为什么这样做?建议请?? 这不是一个家庭作业问题,试图解决在glassdoor dot com上发布的面试问题。

#include <iostream>
#include <vector>
#include <ext/hash_map>
#include <map>
#include <string.h>
#include <sstream>

using namespace __gnu_cxx;
using namespace std;

struct eqstr
{
  bool operator()(int i, int j) const
  {
    return i==j;
  }
};
typedef hash_map<int, int, hash<int>, eqstr> myHash;
int main()
{
    myHash array;
    int inputArr[20] = {1,43,4,5,6,17,12,163,15,16,7,18,19,20,122,124,125,126,128,100};

    for(int i=0;i<20;i++){
        array[inputArr[i]] = inputArr[i]; //save value
    }
    myHash::iterator it = array.begin();
    int data;
    for (; it != array.end(); ++it) {
        data =  it->first;
        cout << ":: " << data;
    }
}

//!Output ::: 1:: 4:: 5:: 6:: 7:: 12:: 15:: 16:: 17:: 18:: 19:: 20:: 43:: 100:: 122:: 124:: 125:: 126:: 128:: 163

3 个答案:

答案 0 :(得分:8)

哈希地图不会自动排序您的数据。实际上,订单是未指定的,具体取决于您的哈希函数和输入顺序。只是在你的情况下,数字结果被排序。

您可能希望了解此容器如何存储数据的hash table

可以通过用999999999替换100来创建一个清晰的计数器示例。结果是

:: 1:: 4:: 5:: 6:: 7:: 12:: 15:: 16:: 17:: 18:: 19:: 20:: 999999999:: 43:: 122:: 124:: 125:: 126:: 128:: 163

(实际原因是hash_map的bucket_count为193,而int的哈希函数是一个标识函数,因此任何低于193的数字都会显示为已排序。)

答案 1 :(得分:1)

哈希映射可能出现,需要根据以下几个因素进行排序:

  • 对于您提供的输入范围,哈希函数返回与输入顺序相同的值。
  • 没有哈希冲突。

无法保证结果将被排序,如果它们以这种方式出现,那只是巧合。

答案 2 :(得分:0)

考虑哈希函数的运作方式。哈希始终是一个函数 f:input-&gt; output ,它将输入集I映射到一个(通常更小的)输出集O中,以便输入集在输出集中大致均匀分布。 / p>

没有要求应该保留订单;实际上,保留它是不寻常的,因为(因为输出集较小),将有值* i,j *具有相同的散列。这称为碰撞

另一方面,没有理由不这样做。事实上,可以证明至少有一个保留订单的序列。

但还有另一种可能性:如果所有值都发生冲突,那么它们就会存储在其他类型的数据结构中,就像列表一样。可能是这些所有的collidge,以及其他结构强加了秩序。

三种可能性:hash_map恰好对特定序列进行排序,或者hash_map实际上是作为一个数组所表达的,或者值collidge和实现以一种给出排序顺序的方式存储冲突。 / p>