STL—unordered_map 哈希表

参考:https://blog.csdn.net/hk2291976/article/details/51037095

1.介绍

最近使用到一个c++的容器——unordered_map,它是一个关联容器,内部采用的是hash表结构,拥有快速检索的功能。

1.1 特性

  1. 关联性:通过key去检索value,而不是通过绝对地址(和顺序容器不同)
  2. 无序性:使用hash表存储,内部无序
  3. Map : 每个值对应一个键值
  4. 键唯一性:不存在两个元素的键一样
  5. 动态内存管理:使用内存管理模型来动态管理所需要的内存空间

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];
    }

猜你喜欢

转载自blog.csdn.net/weixin_40535588/article/details/89815194