【C++】: unordered_map的使用

1、概念

  • key

               键值的类型。unordered_map中的每个元素都是由其键值唯一标识的。

  • T

                映射值的类型。unordered_map中的每个元素都用来存储一些数据作为其映射值。

  • Hash

                一种一元函数对象类型,它接受一个key类型的对象作为参数,并根据该对象返回size_t类型的唯一值。这可以是一个实现函数调用操作符的类,也可以是一个指向函数的指针(参见构造函数)。默认为hash<Key>。

  • Pred

                接受两个键类型参数并返回bool类型的二进制谓词。表达式pred (a, b), pred是这种类型的一个对象,a和b是键值,返回true,如果是应考虑相当于b。这可以是一个类实现一个函数调用操作符或指向函数的指针(见构造函数为例)。这默认为equal_to<Key>,它返回与应用相等操作符(a==b)相同的结果。

  • Allloc

                用于定义存储分配模型的allocator对象的类型。默认情况下,使用allocator类模板,它定义了最简单的内存分配模型,并且与值无关。

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

2、构造函数

(1)创建空的unordered_map

    unordered_map<int, int> m;

(2)使用初始化列表初始化

    unordered_map<int, int> m1({ { 1,1 } });unordered_map<int, int> m2({{ 1,1 },{ 2,2 },{ 3,3 }});

(3)拷贝构造函数初始化

    unordered_map<int, int> m3(m2);

(4)迭代器初始化 

    unordered_map<int, int> m4(m2.begin(),m2.end());

3、内置函数

3.1、容量

(1)判空(返回bool值)

    unordered_map<int, int> m;cout << m.empty();

(2)求大小

    unordered_map<int, int> m;m.size();

 (3)返回无序映射容器可以容纳的最大元素数。

    unordered_map<int, int> m;cout << m.max_size();

3.2、迭代器

    unordered_map<int, int> v;v.begin();          //获取第一个数的位置v.end();            //获取最后一个数的位置unordered_map<int, string> m;m.emplace(make_pair(1, "yi"));m.emplace(make_pair(2, "er"));unordered_map<int, string>::iterator it = m.begin();while (it != m.end()){cout << (*it).first << " " << (*it).second << endl;it++;}

3.3、元素访问

    unordered_map<string, string> mymap;mymap["Bakery"] = "Barbara";  mymap["Seafood"] = "Lisa";    mymap["Produce"] = "John";    string name = mymap["Bakery"];   mymap["Seafood"] = name;mymap["Bakery"] = mymap["Produce"];name = mymap["Deli"];      mymap["Produce"] = mymap["Gifts"];    

  3.4、修改器

(1)emplace(插入)

    unordered_map<int, string> m;m.emplace(make_pair(1, "yi"));m.emplace(make_pair(2, "er"));

 (2)insert(插入)

使用和emplace类似,但是更加灵活

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;int main()
{unordered_map<string, double>myrecipe,mypantry = { {"milk",2.0},{"flour",1.5} };pair<string, double> myshopping("baking powder", 0.3);myrecipe.insert(myshopping);                        // copy insertionmyrecipe.insert(make_pair<string, double>("eggs", 6.0)); // move insertionmyrecipe.insert(mypantry.begin(), mypantry.end());  // range insertionmyrecipe.insert({ {"sugar",0.8},{"salt",0.1} });    // initializer list insertionreturn 0;
}

(3)erase(删除)

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;int main()
{unordered_map<string, string> mymap;// populating container:mymap["U.S."] = "Washington";mymap["U.K."] = "London";mymap["France"] = "Paris";mymap["Russia"] = "Moscow";mymap["China"] = "Beijing";mymap["Germany"] = "Berlin";mymap["Japan"] = "Tokyo";// erase examples:mymap.erase(mymap.begin());      // erasing by iteratormymap.erase("France");             // erasing by keymymap.erase(mymap.find("China"), mymap.end()); // erasing by rangereturn 0;
}

(4)clear(清空)

(5)swap (交换)

3.5、查找 

(1)find(返回迭代器)

 unordered_map<int, string> m;m.emplace(make_pair(1, "yi"));m.emplace(make_pair(2, "er"));unordered_map<int, string>::iterator it = m.find(2);while (it != m.end()){cout << (*it).first << " " << (*it).second << endl;it++;}

(2)count(计数)

 一般在unordered_map中用不到,因为unordered_map中key的值是唯一的

一般在unordered_multimap中用的较多

4、unordered_map的遍历(迭代)

4.1、迭代器 

unordered_map<int, string>::iterator it = m.begin();while (it != m.end()){cout << (*it).first << " " << (*it).second << endl;it++;}

4.2、范围for 

    for (auto e : m){cout << e.first << " " << e.second << endl;}

总结

  1. unordered_map中的的元素是键值对
  2. unordered_map中的key是唯一的,并且不能修改
  3. unordered_map遍历是一个无需的数列
  4. unordered_map的底层为哈希结构
  5. 支持[ ]操作符,operator[ ]中实际进行插入查找

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

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

相关文章

Flask SocketIO 实现动态绘图

Flask-SocketIO 是基于 Flask 的一个扩展&#xff0c;用于简化在 Flask 应用中集成 WebSocket 功能。WebSocket 是一种在客户端和服务器之间实现实时双向通信的协议&#xff0c;常用于实现实时性要求较高的应用&#xff0c;如聊天应用、实时通知等&#xff0c;使得开发者可以更…

java系列:什么是SSH?什么是SSM?SSH框架和SSM框架的区别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 什么是SSH&#xff1f;什么是SSM&#xff1f;SSH框架和SSM框架的区别 前言一、什么是SSH&#xff1f;1.1 Struts2具体工作流程&#xff1a;Struts2的缺点&#xff1a; 1.2 Sp…

【Linux】firewall防火墙配置-解决Zookeeper未授权访问漏洞

背景&#xff1a; zookeeper未授权访问漏洞&#xff0c;进行限制访问&#xff0c;采用防火墙访问策略 配置步骤&#xff1a; ##查看firewall配置清单 firewall-cmd --list-all ##查到为关闭态&#xff0c;启动防火墙 systemctl start firewalld ## 添加端口&#xff0c;这里…

Python入门06布尔值

目录 1 什么是布尔值2 怎么生成布尔值3 在控制程序中使用布尔值4 数据过滤、排序和其他高级操作总结 1 什么是布尔值 首先我们要学习一下布尔值的定义&#xff0c;布尔值是一种数据类型&#xff0c;它只有两个可能的值&#xff1a;True&#xff08;真&#xff09;或 False&…

rabbitmq消息队列实验

实验目的&#xff1a;实现异步通信 实验条件&#xff1a; 主机名 IP地址 组件 test1 20.0.0.10 rabbitmq服务 test2 20.0.0.20 rabbitmq服务 test3 20.0.0.30 rabbitmq服务 实验步骤&#xff1a; 1、安装rabbitmq服务 2、erlang进入命令行&#xff0c;查看版本 …

瑜伽学习零基础入门,各种瑜伽教学方法全集

一、教程描述 练习瑜伽的好处多多&#xff0c;能够保证平衡健康的身体基础&#xff0c;提升气质、塑造形体、陶冶情操&#xff0c;等等。本套教程是瑜伽的组合教程&#xff0c;共由33套视频教程组合而成&#xff0c;包含了塑身纤体&#xff0c;速效瘦身&#xff0c;四季养生&a…

双通道 H 桥 5V 4A驱动芯片

SS6951A 为电机一体化应用提供一种双通道集成电机驱动方案。SS6951A 有两路 H 桥驱动&#xff0c;每个 H 桥可提供最大峰值电流 4.0A&#xff0c;可驱动两个刷式直流电机&#xff0c;或者一个双极步进电机&#xff0c;或者螺线管或者其它感性负载。双极步进电机可以以整步、2 细…

字节大佬整理测试用例编写规范

目录 1.1目的 1.2使用范围 二 测试用例编写原则 2.1系统性 2.2连贯性 2.3全面性 2.4正确性 2.5符合正常业务惯例 2.6仿真性 2.7容错性&#xff08;健壮性&#xff09; 三 测试用例设计方法 3.1 等价类划分法&#xff1a; 3.2 边界值分析法&#xff1a; 3.3 因果图…

Nginx基线检查

扩展知识: Nginx主配置文件:/etc/nginx/nginx.conf 这是Nginx的主要配置文件,用于配置全局的设置、HTTP块、事件处理、邮件等内容。 打开并编辑配置文件 vim /etc/nginx/nginx.conf 一、关于禁止显示服务器版本号和操作系统版本信息: 简介: 在错误页面和响应头中显示…

多路转接<select>和<poll>使用手册

select int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); 参数说明 返回值 返回值>0 表示成功返回可访问的文件描述符个数&#xff0c;返回值0 表示标识等待时间到期返回值<0 表示出现错误…

[蓝桥杯习题]———位运算、判断二进制1个数

⭐Hello!这里是欧_aita的博客。 ⭐今日语录&#xff1a;行动胜过一切。 ⭐个人主页&#xff1a;欧_aita ψ(._. )>⭐个人专栏&#xff1a; 数据结构与算法&#xff08;内含蓝桥杯习题&#xff09; MySQL数据库 位运算 位运算位运算的定义简单运用 实战刷题题目思路代码实现声…

Apipost推出IDEA插件,代码写完直接调试

IDEA是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作&#xff0c;一般需要打开额外的调试工具。 今天给大家介绍一款IDEA插件&#xff1a;Api…

嵌入式数据传输及存储的C语言实现

各种类型的数据传输和存储就涉及到大小端的问题&#xff0c;首先要简单说下芯片的大小端问题&#xff0c;这里主要讨论Cortex-M内核。 M内核支持大端或者小端&#xff0c;实际应用中大部分内核都是小端。以STM32为例&#xff0c;全部都是小端&#xff0c;而且是芯片设计之初就固…

如何使用JMeter测试https请求

HTTP与HTTPS略有不同&#xff0c;所以第一次使用JMeter测试https请求时遇到了问题&#xff0c;百度一番后找到解决方法&#xff1a;加载证书。 下面内容主要记录这次操作&#xff0c;便于后续参考&#xff1a; 操作浏览器&#xff1a;谷歌 &#xff08;1&#xff09;下载被测…

速达软件全系产品 RCE漏洞复现

0x01 产品简介 速达软件是中小企业管理软件第一品牌和行业领导者,是128万家企业用户忠实的选择。14年来速达致力于进销存软件、ERP软件、财务软件、CRM软件等管理软件的研发和服务。 0x02 漏洞概述 速达软件全系产品存在任意文件上传漏洞&#xff0c;未经身份认证得攻击者可以…

推荐几款免费的智能AI伪原创工具

在当今信息快速传播的时代&#xff0c;创作者们常常为了在激烈的竞争中脱颖而出而苦苦挣扎&#xff0c;而其中的一项挑战就是创作出独具创意和独特性的内容。然而&#xff0c;时间有限的现实让很多人望而却步。在这个背景下&#xff0c;免费在线伪原创工具成为了创作者们的得力…

初始Redis(入门篇)

目录 什么是Redis Redis特性 速度快 丰富的功能 客户端语言多 持久化 主从复制 Redis可以做什么 缓存 排行榜系统 计数器应用 消息队列系统 Redis安装 centos7安装 Redis重要文件 Redis的使用 Redis通用命令 set get keys exists del expire 什么是Redi…

基于Java+SpringBoot+Vue3+Uniapp+TypeScript(有视频教程)前后端分离的求职招聘小程序

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

机器人AGV小车避障传感器测距

一、A22超声波传感器 该模块是基于机器人自动控制应用而设计的超声波避障传感器&#xff0c;针对目前市场上对于超声波传感器模组盲区大、测量角度大、响应时间长、安装适配性差等问题而着重设计。 具备了盲区小、测量角度小、响应时间短、过滤同频干扰、体积小、安装适配性高…

csapp-linklab之第3阶段“输出学号”实验报告(强弱符号)

题目 新建一个phase3_patch.o&#xff0c;使其与main.o和phase3.o链接后&#xff0c;运行输出自己的学号&#xff1a; $ gcc -o linkbomb main.o phase3.o phase3_patch.o $ ./linkbomb $学号 提示 利用符号解析中的强弱符号规则。&#xff08;COOKIE字符串未初始化&#xff…