C++ STL unordered_map
map hashmap
文章目录
- Map、HashMap概念
- map、hashmap 的区别
- 引用头文件
- 初始化赋值
- unordered_map 自定义键值类型
- unordered_map 的 value 自定义数据类型
- 遍历
- 常用方法
- 插入
- 查找 key
- 修改 value
- 删除元素
- 清空元素
unordered_map
中每一个元素都是一个 key-value
对,数据类型为 pair
std::pair
主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。
pair
实质上是一个结构体,其主要的两个成员变量是 first
和 second
,这两个变量可以直接使用。
初始化一个 pair
可以使用构造函数,也可以使用 std::make_pair
函数,make_pair
函数的定义如下:
template pair make_pair(T1 a, T2 b) { return pair(a, b); }
一般 make_pair
都使用在需要 pair
做参数的位置,可以直接调用 make_pair
生成 pair
对象。
pair<string, int> student ("zhangsan", 17); // name-age
student.first = "zhangsan";
student.second = 17; product3 = make_pair ("shoes",20.0);
Map、HashMap概念
Map
是STL
的一个关联容器,以键值对存储的数据,其类型可以自己定义,每个关键字在map
中只能出现一次,关键字不能修改。map
也可以说关于key-value
的映射。HashMap
是基于哈希表实现的,每一个元素是一个key-value
对。以空间换时间,是存储key-value
键值对的集合。
map、hashmap 的区别
hash_map
底层采用hash
表存储,map
一般采用红黑树实现,所以hash_map
的key
值是无序的,map
存储是有有序的。map
的优点在于可以自动按照Key
值进行排序,查找时间复杂度是log(n)
;hash_map
优点在于它各项操作的平均时间复杂度接近常数,即O(1).
引用头文件
#include <unordered_map>
初始化赋值
unordered_map<string,string> name_Address ={{"张三","beijing"},{"李四","shanghai"},{"王五","shenzhen"},};
unordered_map 自定义键值类型
如果要将自定义类型作为unordered_map的键值,需如下两个步骤:
- 定义哈希函数的函数对象;
- 定义等比函数的函数对象或者在自定义类里重载operator==()
注意:
- 重载运算符时必须加上
const
- 定义哈希函数的函数对象时,返回值必须为
int
- 打印键值的数据时根据自定义数据类型打印
- 自定义数据类型 默认的缺省构造函数 不能省略,否则会出现编译错误:没有合适的默认构造函数可用。
参考:https://blog.csdn.net/qq_43450920/article/details/127078664
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;struct student{student(string str, int a) : name(str), age(a) {};bool operator==(const student& stu2) const {return stu2.name == name && stu2.age == age;}string name;int age;
};// 定义哈希函数的函数对象
template<class T>
struct Hash {size_t operator()(const T& key) const{return key.age;}
};// 定义等比函数的函数对象
template<class T>
struct MyEqual {bool operator()(const T& key1, const T& key2) const {return key1.name == key2.name && key1.age == key2.age;}
};int main() {struct student stu1 = {"zhangsan", 17};unordered_map<student, string, Hash<student>> students = {make_pair(stu1, "13班")};for(auto x : students) {cout<< x.first.name << " " << x.first.age << "岁 " << x.second << endl;}return 0;
}
unordered_map 的 value 自定义数据类型
unordered_map 的 value 自定义数据类型时,无特殊操作,按照常见数据类型操作即可
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;struct student{string name;int age;
};int main() {struct student stu1 = {"zhangsan", 17};unordered_map<string, student > students = {make_pair("13班", stu1)};for(auto x : students) {cout<< x.first << " " << x.second.name << " " << x.second.age << "岁 " << endl;}return 0;
}
遍历
- 迭代器遍历
for ( auto it = name_Address.begin(); it != name_Address.end(); ++it )cout << " " << it->first << ":" << it->second;
- range for循环遍历
for ( auto x : name_Address )cout << " " << x.first << ":" << x.second;
常用方法
插入
- 构造时插入 pari 类型
pair<string, int> student ("zhangsan", 17);
student.insert (student1);
student.insert (make_pair<string, int>("lisi", 18));
- 构造时插入 数组 类型
// 初始化数组插入(可以用二维一次插入多个元素,也可以用一维插入一个元素)
student.insert ({{"zhangsan", 17}, {"lisi", 18}});
- 数组形式插入
//数组形式插入
myrecipe["coffee"] = 10.0;
查找 key
unordered_map<string, int>::iterator get = student.find ("zhangsan");if ( get == student.end() )cout << "not found";
elsecout << "found "<<get->first << " is " << get->second<<"\n\n";
修改 value
student.at("zhangsan") = 18;
student["zhangsan"] = 17;
删除元素
// 1. 通过位置
student.erase(myrecipe.begin());// 2. 通过key
student.erase("milk");
清空元素
student.clear();
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
C++ STL unordered_map
map hashmap 文章目录 Map、HashMap概念map、hashmap 的区别引用头文件初始化赋值unordered_map 自定义键值类型unordered_map 的 value 自定义数据类型遍历常用方法插入查找 key修改 value删除元素清空元素 unordered_map 中每一个元素都是一个 key-value 对,数据…...
![](https://img-blog.csdnimg.cn/861bd5dca2774e14a8bd8fdcd51e9b54.png)
全流程R语言Meta分析核心技术应用
Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…...
![](https://img-blog.csdnimg.cn/img_convert/04875e5751783e5afef1dfaec1df8735.png)
Go并发可视化解释 - Select语句
昨天,我发布了一篇文章,用可视化的方式解释了Golang中通道(Channel)的工作原理。如果你对通道的理解仍然存在困难,最好呢请在阅读本文之前先查看那篇文章。作为一个快速的复习:Partier、Candier 和 Stringe…...
![](https://img-blog.csdnimg.cn/f0b1e58fcf1246cc91ffb7f6c0887982.png)
在线SM4(国密)加密解密工具
在线SM4(国密)加密解密工具...
![](https://www.ngui.cc/images/no-images.jpg)
golang的类型断言语法
例子1 在 Go 中,err.(interface{ Timeout() bool }) 是一个类型断言语法。它用于检查一个接口类型的变量 err 是否实现了一个带有 Timeout() bool 方法的接口。 具体而言,该类型断言的语法如下: if v, ok : err.(interface{ Timeout() boo…...
![](https://img-blog.csdnimg.cn/img_convert/583e7f4048be315f9b4b86ec6dd8f5f3.png)
提速换挡 | 至真科技用技术打破业务壁垒,助力出海破局增长
各个行业都在谈出海,但真正成功的又有多少? 李宁出海十年海外业务收入占比仅有1.3%,走出去战略基本失败。 京东出海业务磕磕绊绊,九年过去国际化业务至今在财报上都不配拥有姓名。 几百万砸出去买量,一点水花都没有…...
![](https://img-blog.csdnimg.cn/37ac1ce21e574f5aa535299429ab867c.jpeg)
第3篇:vscode搭建esp32 arduino开发环境
第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 1.下载vscode并安装 https://code.visualstudio.com/ 运行VSCodeUserSetup-x64-1.80.1.exe 2.点击扩展,搜索arduino,并点击安装 3.点击扩展设置,配置arduino…...
![](https://www.ngui.cc/images/no-images.jpg)
Apache Shiro是什么
特点 Apache Shiro是一个强大且易用的Java安全框架,用于身份验证、授权、会话管理和加密。它的设计目标是简化应用程序的安全性实现,使开发人员能够更轻松地处理各种安全性问题,从而提高应用程序的安全性和可维护性。下面是一些Apache Shiro的关键特点和概念: 特点和概念…...
![](https://img-blog.csdnimg.cn/b094347271f944629ceab31a2892d9ee.png)
Socket基本原理
一、简单介绍 Socket,又称套接字,是Linux跨进程通信(IPC,Inter Process Communication)方式的一种。相比于其他IPC方式,Socket牛逼在于可做到同一台主机内跨进程通信,不同主机间的跨进程通信。…...
![](https://img-blog.csdnimg.cn/50606a5efe314a9fbd58b609529c2300.png)
Docker容器:本地私有仓库、harbor私有仓库部署与管理
文章目录 Docker容器:本地私有仓库、harbor私有仓库部署与管理一.本地私有仓库1.本地私有仓库概述2.搭建本地私有仓库3.容器重启策略简介 二.harbor私有仓库部署与管理1.什么是harbor2.Harbor的特性3、Harbor的构成4.Harbor私有仓库架构及数据流向5.harbor部署及配置…...
![](https://img-blog.csdnimg.cn/eaf20b2fbf954dabb1ebb38f125541d6.png)
Mobx在非react组件中修改数据,在ts/js中修改数据实现响应式更新
我们都之前在封装mobx作为数据存储的时候,使用到了useContext作为包裹,将store变成了一个hooks使用,封装代码: import React from react import UserInfo from ./user import Setting from ./seting import NoteStore from ./noteclass Stor…...
![](https://img-blog.csdnimg.cn/49003d19702f43c9a233b53cf361faf0.png)
什么是异步编程?什么是回调地狱(callback hell)以及如何避免它?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 异步编程⭐ 回调地狱(Callback Hell)⭐ 如何避免回调地狱1. 使用Promise2. 使用async/await3. 模块化和分离 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订…...
![](https://www.ngui.cc/images/no-images.jpg)
Java8 Stream流常见操作--持续更新中
创建新数组 List<Fruit> newList fruits.stream().map(f -> new Fruit(f.getId(), f.getName() "s", f.getCountry())).collect(Collectors.toList())筛选数组 Map<Boolean, List<TransferData>> preAvg list.stream().collect(Collectors…...
![](https://img-blog.csdnimg.cn/419eb27c2aba441d9fa2ac9565374314.png)
【Linux】多线程概念线程控制
文章目录 多线程概念Linux下进程和线程的关系pid本质上是轻量级进程id,换句话说,就是线程IDLinux内核是如何创建一个线程的线程的共享和独有线程的优缺点 线程控制POSIX线程库线程创建线程终止线程等待线程分离 多线程概念 Linux下进程和线程的关系 在…...
![](https://img-blog.csdnimg.cn/64a0814c73a742839a6488d909ac0232.png)
Qt --- 自定义提示框 类似QMessagebox
QMessageBox::information(NULL, QString("title"), QString("I am information")); 以下是自定义提示框的代码,有图有真相!提示框大部分都采用模态的形式,关于模态也不再多提!所以父类为QDialog,…...
![](https://www.ngui.cc/images/no-images.jpg)
Redis 分布式锁与 Redlock 算法实现
Redis 分布式锁与 Redlock 算法实现 一、简介1. Redis的分布式锁2. 分布式锁的实现原理 二、Redis 分布式锁使用场景1. 分布式系统中数据资源的互斥访问2. 分布式环境中多个节点之间的协作3. 常见场景及应用 三、Redlock算法的原理与实现1. Redlock算法的背景2. Redlock算法的原…...
![](https://hnxx.oss-cn-shanghai.aliyuncs.com/official/1689929181288.gif)
【附安装包】Inventor2024安装教程 机械制图|三维制图
软件下载 软件:Inventor版本:2024语言:简体中文大小:5.61G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.5GHz 内存8G(或更高)下载通道①百度网盘丨64位下载链接:https://pan.baidu…...
![](https://img-blog.csdnimg.cn/ec40950a410e4f38b285c977c74abb22.png)
c++ 判断基类指针指向的真实对象类型
在 c 面向对象使用中,我们常常会定义一个基类类型的指针,在运行过程中,这个指针可能指向一个基类类型的对象,也可能指向的是其子类类型的对象,那现在问题来了,我们如何去判断这个指针到底执行了一个什么类型…...
![](https://img-blog.csdnimg.cn/b4ccae1f71bf48588721d6b20707938e.png)
退出屏保前玩一把游戏吧!webBrowser中网页如何调用.NET方法
本文主要以 HackerScreenSaver 新功能的开发经历介绍 webBrowser中网页如何调用.NET方法的过程。 1. 背景 之前开源了一款名为 HackerScreenSaver 的 Windows 屏保程序。该程序具有模拟黑客炫酷界面的特点,用户可以将自定义的网页作为锁屏界面。不久前,…...
![](https://img-blog.csdnimg.cn/af4574bf6ab840bf9c984a8519756202.png)
hive-列转行
转成 select customer_code,product_type from temp.temp_xx LATERAL VIEW explode(SPLIT(product_types,,)) table_tmp AS product_type where customer_code K100515182...
![](https://img-blog.csdnimg.cn/img_convert/5a073c882a765c45239db576a0d69b64.png)
【网络】IP网络层和数据链路层
IP协议详解 1.概念 1.1 四层模型 应用层:解决如何传输数据(依照什么格式/协议处理数据)的问题传输层:解决可靠性问题网络层:数据往哪里传,怎么找到目标主机数据链路层(物理层)&…...
![](https://img-blog.csdnimg.cn/3c75ef2f630c410d8cbae05dc1b505e6.jpeg#pic_center)
基于Spring Gateway路由判断器实现各种灰度发布场景
文章目录 1、灰度发布实现1.1 按随机用户的流量百分比实现灰度1.2 按人群划分实现的灰度1.2.1 通过Header信息实现灰度1.2.2 通过Query信息实现灰度1.2.3 通过RemoteAdd判断来源IP实现灰度 2、路由判断器2.1. After2.2. Before2.3. Between2.4. Cookie2.5. Header2.6. Host2.7.…...
![](https://img-blog.csdnimg.cn/9ab93278ac0c4745bb74c720e10b9e24.png)
mysql57、mysql80 目录结构 之 Windows
查看mysql 数据存储的位置 /bin:存储可执行文件,主要包含客户端和服务端启动程序,如mysql.exe、mysqld.exe等 /docs:存放一些文档 /include:用于放置一些头文件,如:mysql.h、mysqld_error.h 等 …...
![](https://img-blog.csdnimg.cn/img_convert/117d704517c4ad035d9213a3a24becab.png)
Mac操作系统Safari 17全新升级:秋季推出全部特性
苹果的内置浏览器可能是Mac上最常用的应用程序(是的,甚至比Finder、超级Mac Geeks还要多)。因此,苹果总是为其浏览器Safari添加有用的新功能。在今年秋天与macOS Sonoma一起推出的第17版中,Safari可以帮助你提高工作效…...
![](https://img-blog.csdnimg.cn/41c71f33efac479a90ed3bcfac336e77.png)
UDP通信、本地套接字
#include <sys/types.h> #include <sys/socket > ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);- 参数:- sockfd : 通信的fd- buf : 要发送的数据- len : 发送数据的长度…...
![](https://img-blog.csdnimg.cn/img_convert/d205de4d8be837d1ab37cb739a023891.jpeg)
ChatGPT提示与技巧分享:如何作出更好的提示2023年8月
对ChatGPT的一些酷炫技巧感兴趣吗?这里提供了一些可以帮助你充分利用ChatGPT,成为AI工具专家的技巧。 毫无疑问,ChatGPT是目前最广泛使用的人工智能工具之一。它不仅毫不留情地取代了一些特定领域常用的软件小工具(如智能对联、经典语录生…...
![](https://img-blog.csdnimg.cn/88b6d127f6f644c8a7cfc06047c32dba.png)
网络安全(自学黑客)一文全解
目录 特别声明:(文末附资料笔记工具) 一、前言 二、定义 三、分类 1.白帽黑客(White Hat Hacker) 2.黑帽黑客(Black Hat Hacker) 3.灰帽黑客(Gray Hat Hacker) 四…...
![](https://img-blog.csdnimg.cn/a291947ee8234853ae170f8fd3cb9d62.png)
Vue中ElementUI结合transform使用时,发现弹框定位不准确问题
在近期开发中,需要将1920*1080放到更大像素大屏上演示,所以需要使用到transform来对页面进行缩放,但是此时发现弹框定位出错问题,无法准备定位到实际位置。 查看element-ui官方文档无果后,打算更换新的框架进行开发&am…...
![](https://www.ngui.cc/images/no-images.jpg)
(一)连续随机量的生成-基于分布函数
连续随机量的生成-基于分布函数 1. 概率积分变换方法(分布函数)2. Python编程实现指数分布的采样 1. 概率积分变换方法(分布函数) Consider drawing a random quantity X X X from a continuous probability distribution with …...
![](https://img-blog.csdnimg.cn/08fddb11ac51453d93d5a8935bad8965.png)
【springboot】Spring Cache缓存:
文章目录 一、导入Maven依赖:二、实现思路:三、代码开发: 一、导入Maven依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><…...
![](http://s3.51cto.com/wyfs02/M01/73/00/wKioL1XyK6qiqhfiAAIrv32JLps296.jpg)
广州市住房和城乡建设委员会网站/北京网站推广机构
2015年9月数据库流行榜单最新出炉!与上个月相比,最受欢迎的前10名排名不变。第一梯队依旧是三足继续鼎立:Oracle雄霸榜单,MySQL和SQL Server尾随其后。第二梯队仍是MongoDB为排头兵,稳步攀升。建议以前只专注于RDBMS的…...
![](https://images0.cnblogs.com/blog/566120/201309/17160901-0041c1234d1f4d8fb5e8129f91564b29.jpg)
上海行业网站建设/宁波网络营销有哪些
玩叠骰子 时间限制(普通/Java):3000MS/10000MS 运行内存限制:65536KByte描述 大家都玩过骰子吧,骰子一般都被用来赌博的工具,但是我们ACM的成员不一样。我们可以用骰子来编写出各种各样的题目,给广大爱好ACM的人锻炼思考问题的能力。…...
![](/images/no-images.jpg)
电子商务网站制作/郑州网站定制
一、事务的基本原理Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con Driver…...
vue 网站做中英文切换/北京seo关键词优化外包
原文 https://juejin.im/post/5b4c3a6de51d4519044a6765 选自Medium,作者:Thomas Wolf,机器之心编译。 Cython 是一个工具包,可以使你在 Python 中编译 C 语言,这就是为什么 numpy 和 pandas 很快的原因,C…...
![](https://images2017.cnblogs.com/blog/1163900/201712/1163900-20171210160003833-858874674.png)
成都简阳疫情最新消息/点击seo软件
Html5--6-46 渐变效果 学习要点 掌握线性渐变和径向渐变的使用线性渐变: 属性:linear-gradinet(开始位置 角度,起始颜色,终止颜色 ) 开始位置:渐变开始的位置,属性值可以为百分比/长度/left、right、top、b…...
![](/images/no-images.jpg)
移动web网站开发实训目的/台州seo
Vue.js实现文件上传读取及下载功能发布于 2020-5-28|复制链接摘记: 本文实例为大家分享了vue实现文件上传读取及下载的具体代码,供大家参考,具体内容如下文件的上传利用input标签的type"file"属性,读取用FileReader对象,…...