【STL和泛型编程】4. hashtable、unordered_set、unordered_map
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)
- - 篮子数量>元素数量,每次扩充复制的时候比较耗时
【STL和泛型编程】4. hashtable、unordered_set、unordered_map的更多相关文章
- STL set multiset map multimap unordered_set unordered_map example
I decide to write to my blogs in English. When I meet something hard to depict, I'll add some Chines ...
- STL之map与pair与unordered_map常用函数详解
STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...
- C++进阶(unordered_set+unordered_map模拟实现)
unordered_set unordered_set是以无特定顺序存储唯一元素的容器,并且允许根据它们的值快速检索单个元素,是一种K模型. 在unordered_set中,元素的值同时是它的key, ...
- 侯捷STL学习(十)--容器hashtable探索(unordered set/map)
layout: post title: 侯捷STL学习(十) date: 2017-07-23 tag: 侯捷STL --- 第二十三节 容器hashtable探索 hashtable冲突(碰撞)处理 ...
- [GeekBand] STL与泛型编程(1)
在C++语法的学习过程中,我们已经对模板有了基本的了解.泛型编程就是以模板为工具的.泛化的编程思想.本篇文章介绍了一些在之前的文章中没有涉及到的一些模板知识.泛型编程知识和几种容器.关于模板的一些重复 ...
- STL源码剖析——hashtable
二叉搜索树具有对数时间的搜索复杂度,但是这样的复杂度是再输入数据有足够的随机性的假设上哈希表在插入删除搜索操作上也具有常数时间的表现,而且这种表现是以统计为基础,不需要依赖输入元素的随机性 hasht ...
- 【STL】关联容器 — hashtable
C++ 11哈希表已被列入标准列.hashtable这是hash_set.hash_map.hash_multiset.hash_multimap的底层机制.即这四种容器中都包括一个hashtable ...
- [GeekBand] STL与泛型编程(2)
本篇文章在上一篇文章的基础上进一步介绍一些常用的容器以及STL的一些深入知识. 一. Stack和Queue 栈和队列是非常常用的两种数据结构,由deque适配而来.关于数据结构的知识这里就不在介绍了 ...
- STL容器(C11)--unordered_set用法
http://www.cplusplus.com/reference/unordered_set/
- STL关联容器值hashtable
hashtable(散列表)是一种数据结构,在元素的插入,删除,搜索操作上具有常数平均时间复杂度O(1); hashtable名词 散列函数:负责将某一元素映射为索引. 碰撞(collision):不 ...
随机推荐
- 安装Scikit-learn 0.24.2版本
安装Scikit-learn 0.24.2版本 Anaconda 安装scikit-learn是0.19版本,目前最新版本是0.24.2,之前的版本与现在的版本之间差距还是比较大,因此有必要对scik ...
- C++函数重载的一点问题
问题 #include <iostream> #include <vector> enum A { Value = 1 }; void a(std::vector<int ...
- Spring扩展接口-InstantiationAwareBeanPostProcessor
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 【前端AI实践】DeepSeek:开源大模型的使用让开发过程不再抓头发
有时候你可能正对着屏幕发呆,不知道怎么下手一个 Vue 的流式请求功能.这时候,DeepSeek 就像是你的"编程外挂",帮你把模糊的需求变成清晰的代码. 下面我们就以几个常见的开 ...
- [推荐收藏]JavaScript书籍精读笔记系列导航
写在前面 去年我整理了一份「前端工程师必备书籍清单.md」,得到很多人的关注.这份清单里面的书籍大部分我都看过了,但有些知识点难免看后就忘.之前看这些书对一些重点都进行了记录,最近一段时间计划把这些重 ...
- 数栈产品分享:简析数据中台如何通过DataAPI实现数据共享
数栈是云原生-站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变 ...
- 两步实现让antd与IDE和睦相处的处理案例
导读: Web IDE的开发从来是整个大数据平台开发中非常繁复和笨重的一环,从零搭建一个 Web IDE 通常意味着大量的殚精竭虑和苦思冥想,时间成本更是不可计数.两个UI组件库一起用更是bug的代名 ...
- 开源共建 | Dinky 扩展批流统一数据集成框架 ChunJun 的实践分享
一.前言 ChunJun(原FlinkX)是一个基于 Flink 提供易用.稳定.高效的批流统一的数据集成工具,既可以采集静态的数据,比如 MySQL,HDFS 等,也可以采集实时变化的数据,比如 b ...
- CSP-S 2024 游寄
我不曾忘记 很好听的草神歌,打算推完经过就推这个 . 我的破木箱 装满枯萎的花 放不下 光与壤 和新鲜的愿望 如果能飞翔 去高高的地方 撒一张 梦的网 收集爱的回响 你也在听吗 落单的孩子啊 别害怕 ...
- RESTful API 设计原则深度解析
在 Web 服务架构中,RESTful API作为一种轻量级.可扩展的接口设计风格,通过 HTTP 协议实现资源的标准化访问.本文从核心原则.URL 设计.HTTP 方法应用.状态管理及面试高频问题五 ...