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

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 实质上是一个结构体,其主要的两个成员变量firstsecond ,这两个变量可以直接使用。

初始化一个 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概念

  • MapSTL 的一个关联容器,以键值对存储的数据,其类型可以自己定义,每个关键字在 map 中只能出现一次,关键字不能修改。map 也可以说关于 key-value 的映射。
  • HashMap 是基于哈希表实现的,每一个元素是一个 key-value 对。以空间换时间,是存储 key-value 键值对的集合。

map、hashmap 的区别

  • hash_map 底层采用 hash 表存储,map 一般采用红黑树实现,所以 hash_mapkey 值是无序的,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的键值,需如下两个步骤:

  1. 定义哈希函数的函数对象;
  2. 定义等比函数的函数对象或者在自定义类里重载operator==()

注意

  1. 重载运算符时必须加上 const
  2. 定义哈希函数的函数对象时,返回值必须为 int
  3. 打印键值的数据时根据自定义数据类型打印
  4. 自定义数据类型 默认的缺省构造函数 不能省略,否则会出现编译错误:没有合适的默认构造函数可用。

参考: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;
}

遍历

  1. 迭代器遍历
for ( auto it = name_Address.begin(); it != name_Address.end(); ++it )cout << " " << it->first << ":" << it->second;
  1. range for循环遍历
for ( auto x : name_Address )cout << " " << x.first << ":" << x.second;

常用方法

插入

  1. 构造时插入 pari 类型
pair<string, int> student ("zhangsan", 17);
student.insert (student1); 
student.insert (make_pair<string, int>("lisi", 18)); 
  1. 构造时插入 数组 类型
// 初始化数组插入(可以用二维一次插入多个元素,也可以用一维插入一个元素)
student.insert ({{"zhangsan", 17}, {"lisi", 18}});
  1. 数组形式插入
//数组形式插入
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();

相关文章:

C++ STL unordered_map

map hashmap 文章目录 Map、HashMap概念map、hashmap 的区别引用头文件初始化赋值unordered_map 自定义键值类型unordered_map 的 value 自定义数据类型遍历常用方法插入查找 key修改 value删除元素清空元素 unordered_map 中每一个元素都是一个 key-value 对&#xff0c;数据…...

全流程R语言Meta分析核心技术应用

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…...

Go并发可视化解释 - Select语句

昨天&#xff0c;我发布了一篇文章&#xff0c;用可视化的方式解释了Golang中通道&#xff08;Channel&#xff09;的工作原理。如果你对通道的理解仍然存在困难&#xff0c;最好呢请在阅读本文之前先查看那篇文章。作为一个快速的复习&#xff1a;Partier、Candier 和 Stringe…...

在线SM4(国密)加密解密工具

在线SM4(国密)加密解密工具...

golang的类型断言语法

例子1 在 Go 中&#xff0c;err.(interface{ Timeout() bool }) 是一个类型断言语法。它用于检查一个接口类型的变量 err 是否实现了一个带有 Timeout() bool 方法的接口。 具体而言&#xff0c;该类型断言的语法如下&#xff1a; if v, ok : err.(interface{ Timeout() boo…...

提速换挡 | 至真科技用技术打破业务壁垒,助力出海破局增长

各个行业都在谈出海&#xff0c;但真正成功的又有多少&#xff1f; 李宁出海十年海外业务收入占比仅有1.3%&#xff0c;走出去战略基本失败。 京东出海业务磕磕绊绊&#xff0c;九年过去国际化业务至今在财报上都不配拥有姓名。 几百万砸出去买量&#xff0c;一点水花都没有…...

第3篇:vscode搭建esp32 arduino开发环境

第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 1.下载vscode并安装 https://code.visualstudio.com/ 运行VSCodeUserSetup-x64-1.80.1.exe 2.点击扩展&#xff0c;搜索arduino,并点击安装 3.点击扩展设置&#xff0c;配置arduino…...

Apache Shiro是什么

特点 Apache Shiro是一个强大且易用的Java安全框架,用于身份验证、授权、会话管理和加密。它的设计目标是简化应用程序的安全性实现,使开发人员能够更轻松地处理各种安全性问题,从而提高应用程序的安全性和可维护性。下面是一些Apache Shiro的关键特点和概念: 特点和概念…...

Socket基本原理

一、简单介绍 Socket&#xff0c;又称套接字&#xff0c;是Linux跨进程通信&#xff08;IPC&#xff0c;Inter Process Communication&#xff09;方式的一种。相比于其他IPC方式&#xff0c;Socket牛逼在于可做到同一台主机内跨进程通信&#xff0c;不同主机间的跨进程通信。…...

Docker容器:本地私有仓库、harbor私有仓库部署与管理

文章目录 Docker容器&#xff1a;本地私有仓库、harbor私有仓库部署与管理一.本地私有仓库1.本地私有仓库概述2.搭建本地私有仓库3.容器重启策略简介 二.harbor私有仓库部署与管理1.什么是harbor2.Harbor的特性3、Harbor的构成4.Harbor私有仓库架构及数据流向5.harbor部署及配置…...

Mobx在非react组件中修改数据,在ts/js中修改数据实现响应式更新

我们都之前在封装mobx作为数据存储的时候&#xff0c;使用到了useContext作为包裹&#xff0c;将store变成了一个hooks使用&#xff0c;封装代码: import React from react import UserInfo from ./user import Setting from ./seting import NoteStore from ./noteclass Stor…...

什么是异步编程?什么是回调地狱(callback hell)以及如何避免它?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 异步编程⭐ 回调地狱&#xff08;Callback Hell&#xff09;⭐ 如何避免回调地狱1. 使用Promise2. 使用async/await3. 模块化和分离 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订…...

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…...

【Linux】多线程概念线程控制

文章目录 多线程概念Linux下进程和线程的关系pid本质上是轻量级进程id&#xff0c;换句话说&#xff0c;就是线程IDLinux内核是如何创建一个线程的线程的共享和独有线程的优缺点 线程控制POSIX线程库线程创建线程终止线程等待线程分离 多线程概念 Linux下进程和线程的关系 在…...

Qt --- 自定义提示框 类似QMessagebox

QMessageBox::information(NULL, QString("title"), QString("I am information")); 以下是自定义提示框的代码&#xff0c;有图有真相&#xff01;提示框大部分都采用模态的形式&#xff0c;关于模态也不再多提&#xff01;所以父类为QDialog&#xff0c;…...

Redis 分布式锁与 Redlock 算法实现

Redis 分布式锁与 Redlock 算法实现 一、简介1. Redis的分布式锁2. 分布式锁的实现原理 二、Redis 分布式锁使用场景1. 分布式系统中数据资源的互斥访问2. 分布式环境中多个节点之间的协作3. 常见场景及应用 三、Redlock算法的原理与实现1. Redlock算法的背景2. Redlock算法的原…...

【附安装包】Inventor2024安装教程 机械制图|三维制图

软件下载 软件&#xff1a;Inventor版本&#xff1a;2024语言&#xff1a;简体中文大小&#xff1a;5.61G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.5GHz 内存8G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baidu…...

c++ 判断基类指针指向的真实对象类型

在 c 面向对象使用中&#xff0c;我们常常会定义一个基类类型的指针&#xff0c;在运行过程中&#xff0c;这个指针可能指向一个基类类型的对象&#xff0c;也可能指向的是其子类类型的对象&#xff0c;那现在问题来了&#xff0c;我们如何去判断这个指针到底执行了一个什么类型…...

退出屏保前玩一把游戏吧!webBrowser中网页如何调用.NET方法

本文主要以 HackerScreenSaver 新功能的开发经历介绍 webBrowser中网页如何调用.NET方法的过程。 1. 背景 之前开源了一款名为 HackerScreenSaver 的 Windows 屏保程序。该程序具有模拟黑客炫酷界面的特点&#xff0c;用户可以将自定义的网页作为锁屏界面。不久前&#xff0c;…...

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...

【网络】IP网络层和数据链路层

IP协议详解 1.概念 1.1 四层模型 应用层&#xff1a;解决如何传输数据&#xff08;依照什么格式/协议处理数据&#xff09;的问题传输层&#xff1a;解决可靠性问题网络层&#xff1a;数据往哪里传&#xff0c;怎么找到目标主机数据链路层&#xff08;物理层&#xff09;&…...

基于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.…...

mysql57、mysql80 目录结构 之 Windows

查看mysql 数据存储的位置 /bin&#xff1a;存储可执行文件&#xff0c;主要包含客户端和服务端启动程序&#xff0c;如mysql.exe、mysqld.exe等 /docs&#xff1a;存放一些文档 /include&#xff1a;用于放置一些头文件&#xff0c;如&#xff1a;mysql.h、mysqld_error.h 等 …...

Mac操作系统Safari 17全新升级:秋季推出全部特性

苹果的内置浏览器可能是Mac上最常用的应用程序&#xff08;是的&#xff0c;甚至比Finder、超级Mac Geeks还要多&#xff09;。因此&#xff0c;苹果总是为其浏览器Safari添加有用的新功能。在今年秋天与macOS Sonoma一起推出的第17版中&#xff0c;Safari可以帮助你提高工作效…...

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);- 参数&#xff1a;- sockfd : 通信的fd- buf : 要发送的数据- len : 发送数据的长度…...

ChatGPT提示与技巧分享:如何作出更好的提示2023年8月

​对ChatGPT的一些酷炫技巧感兴趣吗?这里提供了一些可以帮助你充分利用ChatGPT&#xff0c;成为AI工具专家的技巧。 毫无疑问&#xff0c;ChatGPT是目前最广泛使用的人工智能工具之一。它不仅毫不留情地取代了一些特定领域常用的软件小工具&#xff08;如智能对联、经典语录生…...

网络安全(自学黑客)一文全解

目录 特别声明&#xff1a;&#xff08;文末附资料笔记工具&#xff09; 一、前言 二、定义 三、分类 1.白帽黑客&#xff08;White Hat Hacker&#xff09; 2.黑帽黑客&#xff08;Black Hat Hacker&#xff09; 3.灰帽黑客&#xff08;Gray Hat Hacker&#xff09; 四…...

Vue中ElementUI结合transform使用时,发现弹框定位不准确问题

在近期开发中&#xff0c;需要将1920*1080放到更大像素大屏上演示&#xff0c;所以需要使用到transform来对页面进行缩放&#xff0c;但是此时发现弹框定位出错问题&#xff0c;无法准备定位到实际位置。 查看element-ui官方文档无果后&#xff0c;打算更换新的框架进行开发&am…...

(一)连续随机量的生成-基于分布函数

连续随机量的生成-基于分布函数 1. 概率积分变换方法&#xff08;分布函数&#xff09;2. Python编程实现指数分布的采样 1. 概率积分变换方法&#xff08;分布函数&#xff09; Consider drawing a random quantity X X X from a continuous probability distribution with …...

【springboot】Spring Cache缓存:

文章目录 一、导入Maven依赖&#xff1a;二、实现思路&#xff1a;三、代码开发&#xff1a; 一、导入Maven依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><…...

广州市住房和城乡建设委员会网站/北京网站推广机构

2015年9月数据库流行榜单最新出炉&#xff01;与上个月相比&#xff0c;最受欢迎的前10名排名不变。第一梯队依旧是三足继续鼎立&#xff1a;Oracle雄霸榜单&#xff0c;MySQL和SQL Server尾随其后。第二梯队仍是MongoDB为排头兵&#xff0c;稳步攀升。建议以前只专注于RDBMS的…...

上海行业网站建设/宁波网络营销有哪些

玩叠骰子 时间限制(普通/Java):3000MS/10000MS 运行内存限制:65536KByte描述 大家都玩过骰子吧&#xff0c;骰子一般都被用来赌博的工具&#xff0c;但是我们ACM的成员不一样。我们可以用骰子来编写出各种各样的题目&#xff0c;给广大爱好ACM的人锻炼思考问题的能力。…...

电子商务网站制作/郑州网站定制

一、事务的基本原理Spring事务 的本质其实就是数据库对事务的支持&#xff0c;没有数据库的事务支持&#xff0c;spring是无法提供事务功能的。对于纯JDBC操作数据库&#xff0c;想要用到事务&#xff0c;可以按照以下步骤进行&#xff1a; 获取连接 Connection con Driver…...

vue 网站做中英文切换/北京seo关键词优化外包

原文 https://juejin.im/post/5b4c3a6de51d4519044a6765 选自Medium&#xff0c;作者&#xff1a;Thomas Wolf&#xff0c;机器之心编译。 Cython 是一个工具包&#xff0c;可以使你在 Python 中编译 C 语言&#xff0c;这就是为什么 numpy 和 pandas 很快的原因&#xff0c;C…...

成都简阳疫情最新消息/点击seo软件

Html5--6-46 渐变效果 学习要点 掌握线性渐变和径向渐变的使用线性渐变&#xff1a; 属性&#xff1a;linear-gradinet(开始位置 角度&#xff0c;起始颜色&#xff0c;终止颜色 ) 开始位置&#xff1a;渐变开始的位置&#xff0c;属性值可以为百分比/长度/left、right、top、b…...

移动web网站开发实训目的/台州seo

Vue.js实现文件上传读取及下载功能发布于 2020-5-28|复制链接摘记: 本文实例为大家分享了vue实现文件上传读取及下载的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下文件的上传利用input标签的type"file"属性&#xff0c;读取用FileReader对象&#xff0c…...