c++ - 第18节 - 哈希

news2024/11/24 4:28:29

1.unordered系列关联式容器

在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 log_{2}^{N},即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,这里只对unordered_map和unordered_set进行介绍,unordered_multimap和unordered_multiset学生可查看文档介绍。

1.1.unordered_set

1.1.1.unordered_set的介绍

unordered_set类的文档介绍:unordered_set - C++ Reference (cplusplus.com)

注:

1. unordered_set是存储key值的关联式容器。
2. 在unordered_set中,key值用于惟一地标识元素。
3. 在内部,unordered_set没有对key按照任何特定的顺序排序, 为了能在常数范围内找到key,unordered_set将相同哈希值的key放在相同的桶中。
4. unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。
5. 它的迭代器是前向迭代器。

1.1.2.unordered_set的使用

此处只简单演示unordered_set与set的不同,其他接口与set相同,可参考set。

(1)set中的迭代器是双向迭代器,因此set中有begin、end、rbegin、rend函数。unordered_set中的迭代器是单向迭代器,因此unordered_set中有begin、end函数而没有rbegin、rend函数。

(2)set遍历访问的数据是有序的,unordered_set遍历访问的数据是无序的

(3)set底层是红黑树,其搜索效率为log_{2}^{N},unordered_set底层是哈希,其搜索效率为O(1),如下面代码所示

注:rand函数产生的随机数其实是有限制的,c语言rand函数有一个RAND_MAX,其最大只能产生三万多个随机数,因此如果上面的n值很大时,重复的数据是很多的,打印出来的size值(不重复的值)远小于n值。如果想让随机数变得更多可以如下图所示,给rand函数+循环变量i。

1.2.unordered_map

1.2.1.unordered_map的介绍

unordered_map类的文档介绍: unordered_map - C++ Reference (cplusplus.com)
注:
1. unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。
2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此
键关联。键和映射值的类型可能不同。
3. 在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
4. unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭代方面效率较低。
5. unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问
value。
6. 它的迭代器是前向迭代器。

1.2.2.unordered_map的使用

此处只简单演示unordered_map与map的不同,其他接口与map相同,可参考map。

(1)map中的迭代器是双向迭代器,因此map中有begin、end、rbegin、rend函数。unordered_map中的迭代器是单向迭代器,因此unordered_map中有begin、end函数而没有rbegin、rend函数。

(2)map遍历访问的数据是有序的,unordered_map遍历访问的数据是无序的

(3)map底层是红黑树,其搜索效率为log_{2}^{N},unordered_map底层是哈希,其搜索效率为O(1)

1.3.unordered_multiset和unordered_multimap

unordered_multiset和multiset用法及功能基本相同,unordered_multimap和multimap用法及功能基本相同,下面讲解unordered_multiset、unordered_multimap和multiset、multimap的不同:

(1)multiset、multimap中的迭代器是双向迭代器,因此multiset、multimap中有begin、end、rbegin、rend函数。unordered_multiset、unordered_multimap中的迭代器是单向迭代器,因此unordered_multiset、unordered_multimap中有begin、end函数而没有rbegin、rend函数。

(2)multiset、multimap遍历访问的数据是有序的,unordered_multiset、unordered_multimap遍历访问的数据是无序的

(3)multiset、multimap底层是红黑树,其搜索效率为log_{2}^{N},unordered_multiset、unordered_multimap底层是哈希,其搜索效率为O(1)


2.底层结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MockServer 服务框架设计

大部分现有的 mock 工具只能满足 HTTP 协议下简单业务场景的使用。但是面对一些复杂的业务场景就显得捉襟见肘&#xff0c;比如对 socket 协议的应用进行 mock&#xff0c;或者对于支付接口的失败重试的定制化 mock 场景。 为解决上述问题&#xff0c;霍格沃兹测试学院设计并研…

【Redis -String、List介绍和应用场景】

String String 是最基本的 key-value 结构&#xff0c;key 是唯一标识&#xff0c;value 是具体的值&#xff0c;value其实不仅是字符串&#xff0c; 也可以是数字&#xff08;整数或浮点数&#xff09;&#xff0c;value 最多可以容纳的数据长度是 512M。 内部实现 String 类…

万字解析,带你深入掌握多种排序算法!-C语言

今天我们来看排序&#xff0c;排序在生活中经常使用&#xff0c;非常重要&#xff0c;是必学的内容。 目录 1.插入排序 1.1直接插入排序 1.2希尔排序 2.选择排序 2.1直接选择排序 2.2堆排序 3.交换排序 3.1冒泡排序 3.2快速排序 3.2.1挖坑法 3.2.2左右指针法 3.2.3…

【驯服野生verilog-mode全记录】day4 —— 对循环展开语法的python脚本外挂支持

我们的目标是┏ (゜ω゜)☞芯片前端全栈工程师~喵&#xff01; 系列文章目录 【驯服野生verilog-mode全记录】day3 —— 基于vim自动生成verilog-mode格式初始文件模板_尼德兰的喵的博客-CSDN博客 【驯服野生verilog-mode全记录】day2 —— 模块的例化_尼德兰的喵的博客-CSDN…

微服务框架 SpringCloud微服务架构 服务异步通讯 53 MQ 集群 53.4 仲裁队列【RabbitMQ控制台搭建】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯53 MQ 集群53.4 仲裁队列【RabbitMQ控制台搭建】53.4.1 仲裁队列53.4.2 搭建仲裁队列53 MQ 集…

10. 注解开发Bean作用范围和生命周期管理

1. bean作用范围注解配置 使用Scope注解定义bean作用范围 1.1. singleton为单例 1.1.1 在bean头上使用Scope注解&#xff0c;singleton package com.lin.dao.impl;import com.lin.dao.BookDao; import org.springframework.context.annotation.Scope; import org.springfra…

企业档案管理实务:档案的检索方法知多少

在鸿翼档案的企业档案系统设计中&#xff0c;企业档案常用的检索实际上包括两个行为&#xff1a;企业档案信息的贮存和企业档案信息的查找。档案检索工具一方面是整个企业档案检索体系中贮存结果的最终体现&#xff0c;直接反映贮存的质量和水平&#xff1b;另一方面又是各项业…

Redis 哈希(Hash)方法使用详解

目录一、简介二、常用方法2.1、HSET2.2、HSETNX2.3、HGET2.4、HINCRBY、HINCRBYFLOAT2.5、HSTRLEN2.6、HEXISTS2.7、HDEL2.8、HLEN2.9、HMSET、HMGET2.10、HKEYS、HVALS、HGETALL2.11、HSCAN一、简介 本文今天主要是讲哈希&#xff08;Hash&#xff09;的方法的使用&#xff0c…

毕业设计 单片机手势检测识别系统 - arduino 物联网 嵌入式

文章目录0 前言1 简介2 主要器件3 实现效果4 设计原理5 部分核心代码6 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长…

uniapp中video层级太高(或者在页面中不跟随页面滚动)解决方案

我觉得这个问题有必要记录一下。最近项目中遇到的问题&#xff1a;项目是uniapp开发&#xff0c;有一个商品详情的页面和一个视频竖向轮播的页面。 问题描述 1、商品详情页上面是图片轮播(包含视频)&#xff0c;下面是商品详情&#xff0c;当页面上下滑动时&#xff0c;如果当…

微服务框架 SpringCloud微服务架构 服务异步通讯 52 惰性队列 52.2 惰性队列

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯52 惰性队列52.2 惰性队列52.2.1 惰性队列52.2.2 总结52 惰性队列 52.2 惰性队列 52.2.1 惰…

【BTC】Fork

区块链中fork的分类&#xff1a; state fork&#xff1a; 两个节点差不多同一个时候挖到了矿&#xff0c;就会出现一个临时性的分叉。 forking attack&#xff08;deliberate fork&#xff09;&#xff1a;也是属于对比特币这个区块链当前的状态产生的意见分歧&#xff0c;只不…

汇编语言笔记——汇编程序开发、汇编大作业

文章目录传送门汇编程序开发汇编代码初步实践dos虚拟机与挂载实模式Hello World代码解析汇编链接重新汇编与批处理反汇编与debug保护模式Hello WorldVS2017masm32环境配置汇编基础语言概述汇编环境汇编语言语句格式常用伪指令数据定义符号定义操作符\$OFFSET算术操作符逻辑操作…

【基础】RabbitMQ 基础

RabbitMQ 基础RabbitMQ 基本介绍RabbitMQ 基本概念ConnectionChannelVirtual HostQueueExchangedirectfanouttopicheadersRabbitMQ 基本介绍 RabbitMQ 是使用 Erlang 语言开发的基于 AMQP 协议来实现的开源消息队列系统。 RabbitMQ 的特点&#xff1a; 灵活路由&#xff1a;E…

社招前端二面react面试题整理

解释 React 中 render() 的目的。 每个React组件强制要求必须有一个 render()。它返回一个 React 元素&#xff0c;是原生 DOM 组件的表示。如果需要渲染多个 HTML 元素&#xff0c;则必须将它们组合在一个封闭标记内&#xff0c;例如 <form>、<group>、<div&g…

什么是数据标注,它的用途是什么?

什么是数据标注&#xff1f; 从本质上讲&#xff0c;数据标注是对计算机视觉或自然语言处理 (NLP)可识别的材料内容进行标记的过程。当我们标记或标注这些类型的数据时&#xff0c;它们变得更容易输入算法或编程以通过 NLP 进行解释。 得益于数据标注&#xff0c;人工智能 (…

【Vue】Vue项目打包上线流程--20221219

Vue项目打包上线流程 我的链接https://blog.csdn.net/m0_46629123/article/details/128371149 1.打包 npm run build 2.准备服务器 1.准备demo文件夹&#xff0c;并CMD输入npm init 2.CMD输入npm i express 3.新建并编辑server.js server.js const express require(…