当前位置: 首页 > news >正文

一文学会c++哈希

文章目录

  • unordered系列关联性容器
    • unordered_map
  • ❤底层结构
    • 哈希概念

unordered系列关联性容器

❤必看红黑树篇

STL提供了底层为红黑树的一系列容器,查询的效率为log2n,即最差情况下需查询红黑树高度次,如果数据太多,查询效率还是不理想,所以c++11又提供了unordered系列容器查询效率可达O(1),使用方法与红黑树系列容器基本一致,只是底层不一样,也有4个
unordered_map, unordered_set, unordered_multimap, unordered_multiset

unordered_map

unordered_map文档
特性:
1,unordered_map存储<key,value>键值对,通过key值直接找到value
2,unordered_map存储key值唯一,value是映射值,两者类型可以不同。
3,unordered_map没有对<key,value>进行任何排序
4,unordered_map将相同哈希值存到同一个哈希桶中
5,unordered_map查询比map快,但遍历元素比map慢,(因为要遍历许多空的哈希桶)
6,unordered_map实现了[],可以直接通过key访问value

接口:

1 构造:

unordered_map构造各种类型的unordered_map对象

2 容量:

bool empty() const检查unordered_map是否为空
size_t size() const检查unordered_map有效元素个数

3 迭代器:

begin()返回第一个元素的迭代器
end()返回最后一个元素下一个元素迭代器
cbegin()返回第一个元素const迭代器
cend()返回最后一个元素下一个元素const迭代器

4 💪元素访问[]

operator[]通过key访问value

注意,该函数实际调用插入操作,
⭐如果哈希表中无key,直接插入并返回 V(),
⭐如果哈希表有key插入失败,说明存在,返回value值

5 查询

iterator find(const K& key)返回key值在哈希桶中位置
size_t count(const K& key)返回哈希桶中关键码为key的个数

注意:unordered_map中count最多为1

6 修改

insert(make_pair())插入键值对
erase(const K& key)删除key值
void clear()清空容器
void swap(const unordered_map& )交换两个容器元素

7 unordered_map桶操作

size_t bucket_count() const返回哈希桶中桶的个数
size_t bucket(const K&key)返回key值在哈希桶号
size_t bucket_size(size_t n)返回n号哈希桶有效元素个数
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{int a[] = { 5,8,7,6,89,5,3,5,5,4,11};unordered_map<int, int> mp;for (auto& e : a){mp.insert(make_pair(e, e));}cout << mp.bucket_count()<<endl;for (auto& e:a){cout<<mp.bucket(e)<<" ";}return 0;
}

在这里插入图片描述

unordered_set没什么好说的,与set区别就是无顺序
unordered_set文档

❤底层结构

哈希系列容器之所以效率高,因为使用了哈希结构

哈希概念

顺序结构和平衡树关键码和对应位置无关系,因此查询一个元素时,必须经过关键码的多次比较,顺序结构O(N),树形结构O(logN),效率取决于比较次数

理想搜索方法,=不经过任何比较一次性直接找到值将关键码和存储位置建立一一映射关系,搜索时直接找到。

向该结构中

  • 插入元素:将关键值交给哈希函数计算出存储位置的值并在该位置存储
  • 搜索元素:将关键值交给哈希函数将计算出的值当作存储位置,若此位置关键码相等,则搜索成功,

例如集合{1,7,6,4,5,9}
将哈希函数设置为 hash(key)= key%capacity,capacity为底层存储空间总大小

在这里插入图片描述

http://www.dtcms.com/a/394378.html

相关文章:

  • 【06】EPGF 架构搭建教程之 本地环境管理工具的本地化
  • 【开发实践】DNS 报文分析与 CDN 架构可视化方案
  • Ubuntu 系统下 Nginx + PHP 环境搭建教程
  • AI 如何改变日常生活
  • 字典树 Trie 介绍、实现、封装与模拟 C++STL 设计
  • 第一性原理(First Principles Thinking)
  • 1.UE-准备环境(一)-账号注册和打开虚幻引擎源码页面
  • javascript `AbortController`
  • 时间复杂度与空间复杂度
  • rocketmq队列和消费者关系
  • RAG评估指南:从核心指标到开源框架,打造高效检索生成系统
  • xtuoj 0x05-A 前缀和
  • 防误删 (实时) 文件备份系统 (btrfs 快照 + rsync)
  • 【FreeRTOS】第七课(1):任务间通信(使用队列)
  • OD C卷 - 二叉树计算
  • DiffDock 环境安装和使用教程
  • NVIC中的不可屏蔽中断NMI(Non-Maskable Interrupt)是什么?
  • TypeORM 浅析
  • 2.4 死锁 (答案见原书 P165)
  • 算法与数据结构:常见笔试题总结
  • trae使用playwright MCP方法流程
  • anaconda安装tensorflow遇到的一个错误
  • 不同浏览器对 http.server 提供MP4 文件支持差异分析
  • Python 实战:内网渗透中的信息收集自动化脚本(10)
  • leetcode 206 反转链表
  • AI智能的网站SEO优化服务商
  • 生产者客户端
  • Puppeteer 在爬取电商 JavaScript 页面的使用
  • 2015/12 JLPT听力原文 问题四
  • 【设计模式】备忘录模式