代码之家  ›  专栏  ›  技术社区  ›  Chenna V

HASHMAP是否自动排序[C++ ]?

  •  2
  • Chenna V  · 技术社区  · 16 年前

    在下面的代码中,hash_map会自动排序,或者可能会按排序顺序插入元素。你知道为什么要这么做吗??请提出建议?? 这不是一个家庭作业问题,试图解决一个发布在glassdoor.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 回复  |  直到 16 年前
        1
  •  8
  •   kennytm    16 年前

    哈希映射不会自动 分类

    你可能想看看 hash table 此容器如何存储数据。

    一个清晰的反例可以通过用99999999替换100来创建。结果是

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

    (实际原因是哈希图的 bucket_count 是193和 int

        2
  •  1
  •   Mark Ransom    16 年前

    散列图可能 根据几个因素进行排序:

    • 没有哈希冲突。

        3
  •  0
  •   Charlie Martin    16 年前

    考虑一下散列函数是如何工作的。哈希始终是一个函数 f: 输入->输出 它将输入集I映射为(通常较小)输出集O,以便输入集在输出集上近似均匀分布。

    要求 碰撞 .

    另一方面,它没有理由不应该。事实上,它可以被证明总是存在至少一个序列 维持秩序。

    但是还有另一种可能:如果所有的值都发生冲突,那么它们将被存储在其他类型的数据结构中,比如列表。可能是这些东西相互碰撞,而另一种结构强加了秩序。

    hash_map 哈希图