C++——unordered_map讲解

文章目录

    • unordered_map讲解
      • 1. 引入头文件
      • 2. 基本概念
      • 3. 声明和初始化
      • 4. 基本操作
        • 插入元素
        • 访问元素
        • 删除元素
        • 查找元素
        • 迭代器
      • 5. 注意事项
      • 6. 总结

unordered_map讲解

<unordered_map> 是 C++ 标准库中的一个头文件,提供了哈希表的实现,即无序关联容器。std::unordered_map 是一种关联容器,它使用哈希表来存储键值对,从而提供平均常数时间复杂度的查找、插入和删除操作。以下是对 <unordered_map> 详细讲解,包括其主要特性、使用方法和注意事项。

1. 引入头文件

#include <unordered_map>

2. 基本概念

  • 键值对std::unordered_map 中的每个元素都是一个键值对(key-value pair),其中键是唯一的,值可以重复。
  • 哈希表std::unordered_map 使用哈希表来存储元素,通过哈希函数将键映射到桶中,从而提供快速的查找和更新操作。

3. 声明和初始化

#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap;  // 创建一个空的 unordered_mapstd::unordered_map<int, std::string> umap2 = {{1, "one"}, {2, "two"}, {3, "three"}};  // 使用初始化列表return 0;
}

4. 基本操作

插入元素
  • insert(): 插入键值对
  • emplace(): 原地构造键值对
#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap;umap.insert({1, "one"});  // 使用 insert() 插入键值对umap.emplace(2, "two");   // 使用 emplace() 原地构造键值对return 0;
}
访问元素
  • operator[]: 通过键访问或插入元素
  • at(): 通过键访问元素,若键不存在则抛出异常
#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}};std::cout << umap[1] << std::endl;      // 输出 "one"std::cout << umap.at(2) << std::endl;   // 输出 "two"// 若键不存在,operator[] 会插入一个新的元素,at() 则会抛出异常std::cout << umap[3] << std::endl;      // 输出空字符串,并插入 {3, ""}try {std::cout << umap.at(4) << std::endl;  // 抛出异常} catch (const std::out_of_range& e) {std::cout << e.what() << std::endl;}return 0;
}
删除元素
  • erase(): 删除指定键的元素或删除指定位置的元素
#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}, {3, "three"}};umap.erase(2);  // 删除键为 2 的元素for (const auto& pair : umap) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}
查找元素
  • find(): 查找键并返回指向该元素的迭代器
  • count(): 返回指定键的出现次数(对于 unordered_map,结果要么是 0 要么是 1)
#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}, {3, "three"}};auto it = umap.find(2);  // 查找键为 2 的元素if (it != umap.end()) {std::cout << "Found: " << it->first << ": " << it->second << std::endl;} else {std::cout << "Not found" << std::endl;}std::cout << "Count of key 3: " << umap.count(3) << std::endl;  // 输出 1std::cout << "Count of key 4: " << umap.count(4) << std::endl;  // 输出 0return 0;
}
迭代器
  • begin(): 返回指向第一个元素的迭代器
  • end(): 返回指向最后一个元素后一位置的迭代器
#include <unordered_map>
#include <iostream>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}, {3, "three"}};for (auto it = umap.begin(); it != umap.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;}return 0;
}

5. 注意事项

  • 无序性std::unordered_map 中的元素无序存储,不能依赖元素的插入顺序或访问顺序。
  • 哈希函数:默认情况下,std::unordered_map 使用 std::hash 来计算键的哈希值。如果需要自定义哈希函数,可以在模板参数中指定。
  • 负载因子:哈希表的性能与负载因子相关。负载因子是元素数量与桶数量的比值。通过 load_factor() 可以获取当前负载因子,通过 max_load_factor() 可以设置最大负载因子。
  • 性能std::unordered_map 的平均时间复杂度是常数时间,但在最坏情况下可能退化为线性时间。选择合适的哈希函数和负载因子可以提高性能。

6. 总结

<unordered_map> 提供了高效的键值对存储和查找功能,是 C++ 标准库中非常有用的容器之一。通过掌握其基本操作和注意事项,可以在各种编程场景中高效地使用 std::unordered_map

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

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

相关文章

超参数调优-通用深度学习篇(上)

文章目录 深度学习超参数调优网格搜索示例一&#xff1a;网格搜索回归模型超参数示例二&#xff1a;Keras网格搜索 随机搜索贝叶斯搜索 超参数调优框架Optuna深度学习超参数优化框架nvidia nemo大模型超参数优化框架 参数调整理论&#xff1a; 黑盒优化&#xff1a;超参数优化…

【Unity导航系统】Navigation组件的概念及其使用示例

Unity中的Navigation组件是一套用于创建和控制导航网格&#xff08;NavMesh&#xff09;的工具&#xff0c;允许游戏对象&#xff08;特别是AI代理&#xff0c;如NavMeshAgent&#xff09;在复杂的3D环境中进行自动寻路。Navigation组件主要包括以下几个方面&#xff1a; Navi…

CSDN低质量分文章自动化获取

1. 背景 最近粉丝终于达到了5K&#xff0c;可是仍然无法通过优质作者申请&#xff0c;原来是平均质量分较低&#xff0c;优化了一些文章后分数提高仍然较慢&#xff0c;所以需要批量获取低质量文章&#xff0c;重点优化 2. 目标效果 3. 核心代码 其中的Cookie可以根据浏览器…

BFS【2】迷宫

目录 迷宫 走到右下角最短路径长度 走到右下角最短路径 跨步迷宫 迷宫 走到右下角最短路径长度 我是和上一篇一样&#xff0c;创建一个队列&#xff0c;不过while 里面判责是queue非空&#xff0c;否则会死循环万一是死路的话。 也是要判断不要重复入队。 #include <…

车联网文章合集

文章来源如下&#xff1a; 汽车ECU介绍浅谈域控制器整车5大域控制器智能座舱域控制器车身域控制器汽车T-BOX介绍

使用java +paho mqtt编写模拟发布温度及订阅的过程

启动mqtt 服务 创建项目&#xff0c;在项目中添加模块 添加文件夹 添加maven依赖 <dependencies><dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.2.0<…

夏至的中医理论,提供相关的养生建议。包括饮食、运动、作息等方面的建议。

夏至中医养生建议 夏至&#xff0c;作为夏季的一个重要节气&#xff0c;标志着炎热季节的正式开始。在中医理论中&#xff0c;夏至被视为阳气最旺盛的时期&#xff0c;因此&#xff0c;养生之道需顺应夏季阳盛阴衰的特点&#xff0c;以保护阳气、调整阴阳平衡为核心。以下从饮…

vue3使用富文本

1、下载 pnpm install wangeditor/editor wangeditor/editor-for-vue 2、引入和使用 <Toolbar style"border-bottom: 1px solid #ccc" :editor"editorRef" :defaultConfig"toolbarConfig" mode"default" /><Editorstyle&q…

如何下载和安装SQLynx数据库管理工具? (MySQL作为测试数据库)

目录 1. 官网下载 2. 安装软件 3. 启动SQLynx软件 4. 开始使用 5. 执行第一条SQL语句 6. 总结 SQLynx是一款先进的Web SQL集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为数据库管理、查询和数据分析设计。作为一个基于浏览器的工具&#xff08;同时也支持桌面…

ruby中语法知识

return home 参考链接 理解Ruby中的作用域Ruby 中的类与对象Ruby学习之元编程  Kernel#evel(), Object#instance_evel()、Module#class_evel() 知识点 ruby中include和extend以及模块中ClassMethods Ruby require,load,include,extend的显著区别 Ruby中的 Object、Class、…

二分查找与移除元素有序数组的平方、 长度最小的子数组、螺旋矩阵II

数组 704. 二分查找 704. 二分查找 - 力扣 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 class Solution { public:…

Spring Cloud Hystrix快速入门demo

1.什么是Spring Cloud Hystrix&#xff1f; Spring Cloud Hystrix 是一个用于处理分布式系统中故障的库。它实现了熔断器模式&#xff0c;可以防止由于故障服务的连锁反应而导致整个系统崩溃。Spring Cloud Hystrix 提供了丰富的功能&#xff0c;如熔断、降级、限流、缓存等&a…

Python xlwt库:写excel表格

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

基于java+springboot+vue实现的电商应用系统(文末源码+Lw)241

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本电商应用系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

当flex-direction: column时,设置flex:1不生效解决办法

当需求是: 页面纵向排列,且最后一个元素撑满剩余高度 flex:1在横向排列时是可以的,但是纵向排列会失效,此时需要给最后一个子元素设置align-self: stretch;即可撑满剩余高度 <div class"father"><div class"child child1"></div><div…

Python抓取高考网图片

Python抓取高考网图片 一、项目介绍二、完整代码一、项目介绍 本次采集的目标是高考网(http://www.gaokao.com/gkpic/)的图片,实现图片自动下载。高考网主页如下图: 爬取的流程包括寻找数据接口,发送请求,解析图片链接,向图片链接发送请求获取数据,最后保存数据。 二…

C++设计模式——Composite组合模式

一&#xff0c;组合模式简介 真实世界中&#xff0c;像企业组织、文档、图形软件界面等案例&#xff0c;它们在结构上都是分层次的。将系统分层次的方式使得统一管理和添加不同子模块变得容易&#xff0c;在软件开发中&#xff0c;组合模式的设计思想和它们类似。 组合模式是…

DDP(Differential Dynamic Programming)算法举例

DDP(Differential Dynamic Programming)算法 基本原理 DDP(Differential Dynamic Programming)是一种用于求解非线性最优控制问题的递归算法。它基于动态规划的思想,通过线性化系统的动力学方程和二次近似代价函数,递归地优化控制策略。DDP的核心在于利用局部二次近似来…

(vue3)引入组件标红,...has no default export 组件没有默认导出

(vue3)引入组件标红&#xff0c;…has no default export 组件没有默认导出 一、项目背景&#xff1a; 创建的vitevue3ts项目页面有标红,但程序不报错 二、原因 由于之前安装了 Vetur 插件&#xff0c;Vetur 默认使用 eslint-plugin-vue&#xff0c;并且强制 export default …

linux升级openssh

在日常开发中&#xff0c;经常会需要升级服务器漏洞&#xff0c;记录一下linux升级openssh相关&#xff0c;服务器版本为centos7.8&#xff0c;升级有两种方案&#xff0c;一种是可以上互联网环境&#xff0c;一种是内网环境&#xff0c;我这边因为是内网环境&#xff0c;只能进…