参考:https://blog.csdn.net/hk2291976/article/details/51037095
1.介绍
最近使用到一个c++的容器——unordered_map,它是一个关联容器,内部采用的是hash表结构,拥有快速检索的功能。
1.1 特性
- 关联性:通过key去检索value,而不是通过绝对地址(和顺序容器不同)
- 无序性:使用hash表存储,内部无序
- Map : 每个值对应一个键值
- 键唯一性:不存在两个元素的键一样
- 动态内存管理:使用内存管理模型来动态管理所需要的内存空间
1.2 Hashtable和bucket
由于unordered_map内部采用的hashtable的数据结构存储,所以,每个特定的key会通过一些特定的哈希运算映射到一个特定的位置,我们知道,hashtable是可能存在冲突的(多个key通过计算映射到同一个位置),在同一个位置的元素会按顺序链在后面。所以把这个位置称为一个bucket是十分形象的(像桶子一样,可以装多个元素)。可以参考这篇介绍哈希表的文章
所以unordered_map内部其实是由很多哈希桶组成的,每个哈希桶中可能没有元素,也可能有多个元素。
2.在算法的运用
哈希表思想找数组中只出现一次的数字
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
unordered_map<int, int> hash;
int i, num = data.size();
int a[2],j=0;
vector<int>vec;
for (i = 0; i < num; i++)
{
hash[(data[i] + '0')]++;//hash[data[i]]++;
}
for (i = 0; i < num; i++)
{
if (hash[(data[i] + '0')]<2) {vec.push_back(data[i]);}
}
*num1 =vec[0];
*num2 =vec[1];
}