在下面的代码中,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
答案 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>