首页 > 编程语言 >【STL和泛型编程】4. hashtable、unordered_set、unordered_map

【STL和泛型编程】4. hashtable、unordered_set、unordered_map

时间:2024-03-01 17:22:20浏览次数:466  
标签:map set unordered hashtable Key class

1. hashtable

前置知识:【数据结构】3.跳表和散列 

基本原理:

  • 将Key计算成一个数值,然后取余数得到它在表头中的位置
  • table(篮子)里每个指针都指向一个链表(桶)来存储余数相同的值
  • 如果桶内的元素个数比篮子个数还多,则将篮子的大小扩充
  • 篮子是vector,数量是质数,初始为53,53扩充后为97

  hashtable需要传入Value(Key+Data),Key,计算哈希的方法,从Value中取出Key的方法,比较Key是否相等的方法,以及分配器来实例化

template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKey, class Alloc=alloc>
class hashtable {
public:
    typedef HashFcn   hasher;
    typedef EqualKey  key_equal;
    typedef size_t    size_type;
private:
    hasher hash;
    key_equal equals;
    ExtractKey get_key;
    
    typedef __hashtable_node<Value> node;

    vector<node*, Alloc> bucket;
    size_type num_element;
public:
    size_type bucket_count() const {return bucket.size(); }
};
template <class Value>
struct __hashtable_node {
    __hashtable_node* next;
    Value val;
};

    hashtable的篮子使用vector数组实现,迭代器中有两个指针,*cur指向当前元素位置,*ht指向它在篮子中的位置,实现操作者视角的++操作

template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKey, class Alloc>
struct __hashtable_iterator {
    //...
    node* cur;
    hashtable* ht;
    // ...
};

2. unordered_set / multi

  第二个模板参数中,C++底层提供的哈希函数 hash<Key> 只适用于基本数据类型(包括 string 类型);第三个模板参数中,仅支持可直接用 == 运算符做比较的数据类型

template < class Key,                      //容器中存储元素的类型
           class Hash = hash<Key>,        //确定元素存储位置所用的哈希函数
           class Pred = equal_to<Key>,    //判断各个元素是否相等所用的函数
           class Alloc = allocator<Key>   //指定分配器对象的类型
           > class unordered_set;

3. unordered_map / multi

  Key是键值对中的键、T是键值对中的data,<Key, T>组成hashtable中的Value。接下来的模板参数与unordered_set中相同

template < class Key,                        //键值对中键的类型
           class T,                          //键值对中值的类型
           class Hash = hash<Key>,           //容器内部存储键值对所用的哈希函数
           class Pred = equal_to<Key>,       //判断各个键值对键相同的规则
           class Alloc = allocator< pair<const Key,T> >  // 指定分配器对象的类型
           > class unordered_map;

4. unordered_map 和 map 对比

  • map / set ,底层实现是红黑树
    • + 自带排序的性质
    • + 查找的时间复杂度是O(logn)
    • - 每个节点都需要存储额外的信息
  • unordered_map / unordered_set,底层是哈希表
    • + 哈希表通过Key计算查找非常快 理想情况下是O(1)
    • - 篮子数量>元素数量,每次扩充复制的时候比较耗时

标签:map,set,unordered,hashtable,Key,class
From: https://www.cnblogs.com/stux/p/18042797

相关文章

  • dev_set_lut显示效果
    1.原图——dev_set_lut('default')2.dev_set_lut('rainbow')3.dev_set_lut('temperature') 4.dev_set_lut('inverse') 其它可设置参数:*'default','linear','inverse','sqr','inv_......
  • 微信小程序中调用wx.getSetting可以获取到哪些权限设置
    微信小程序中调用wx.getSetting可以获取到哪些权限设置:https://blog.csdn.net/u012767761/article/details/119648707?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170928385316800222888134%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&reque......
  • vue项目引入高德地图报错:Map container div not exist (火狐浏览器不加载地图)
    问题描述:谷歌浏览器正常显示地图,火狐浏览器不加载,并且报错:  Mapcontainerdivnotexist错误代码如下:  修改后代码如下:  参考大佬:https://blog.csdn.net/white_777/article/details/128286558  ......
  • Superset3 前后端搭建详解
    Superset3搭建目录Superset3搭建后端:方法1、在Windows本地搭建方法2:运维线上搭建前端:前端搭建Superset数据库其他Superset框架是一套包括前后端代码的框架,后端语言为Python,前端语言为React,superset启动后包括一个前端地址+端口,一个后端地址+端口的服务,后端这个服务是带......
  • 前端学习-vue视频学习003-setup(重要)
    学习教程-尚硅谷视频将原vue2的格式改为vue3---使用setup要点:this在vue3中被弱化,setup函数中不能使用this定义数据时,如果不是响应式的(暂时还不是很理解响应式),不会触发页面的变化vue3支持一个标签直接写多次,如<template><Person/><Person/><Person/></t......
  • 基础数据结构->set&&map
    set&&mapBEGIN:惜墨如金set用法#include<bits/stdc++.h>usingnamespacestd;voidthe_map(){map<string,int>ds;stringkis="kis";ds[kis]=2;ds["a+a"]=3;ds["b+"]=4;ds["c-"]=5;//这样就可将这个“数......
  • 面试官上来就让手撕HashMap的7种遍历方式,当场愣住,最后只写出了3种
    写在开头今天有个小伙伴私信诉苦,说面试官上来就让他手撕HashMap的7种遍历方式,最终只写出3种常用的,怀疑面试官是在故意***难。这个问题大家怎么看?反正我个人感觉这肯定不是***难,“手撕遍历方式”算是一个比较简单的考验方式了,而且集合的遍历又是日常开发的必备!至于要一下写出7......
  • JUC系列之(四)ConcurrentHashMap锁分段机制
    ConcurrentHashMap锁分段机制1.关于HashMap和HashTableHashMap:线程不安全HashTable:效率低:操作时锁整个表复合操作会带来安全问题//table.contains()和table.put()分别都是加了锁的,但是像下述复合操作,一个线程判断完之后CPU可能被其他线程抢夺,带来安全问题if(!table.c......
  • 使用safe-area-inset-*来适配iPhoneX的刘海屏及底部横条区域
    之前一直沿用同事写的媒体查询处理这个问题,所有固定在底部展示的按钮栏都要用媒体查询来定义距离底部的距离,着实不太方便,而且媒体查询比较有局限性,不太可能把市面上所有机型都适配一遍。刚好要处理折叠屏适配问题,重构了一个复杂页面的布局,就找到了使用safe-area-inset-*来适配iPh......
  • vue——使用yarn安装electron依赖时报错:RequestError: read ECONNRESET
    参考:1.Electron安装报错RequestError:readECONNRESEThttps://blog.csdn.net/qq_33835370/article/details/123612429?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-123612429-blog-122476584.235^v43^control&spm=1......