unordered_map 与 unordered_set 的使用

unordered_map

unordered_map 的介绍文档

unordered_map 的介绍文档:来自cpluscplus.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. 它的迭代器至少是前向迭代器。

unordered_map 是 C++11 的语法,C++98 是没有 unordered_map

构造函数

unordered_map 存储的数据是:key-value 的结构,因此实例化 unordered_map 需要传入两个模板参数。unordered-map 的底层数据结构是哈希表。unordered_map 数据 key-value 形式的存储你可以理解为哈希表存储了一个 pair 。传入的第一个模板参数就是 pair 的 first,传入的第二个模板参数就是 pair 的 second。

  • unordered_map 可以无参构造,这是在做算法题用的比较多的。
  • unordered_map 可以使用 initializer_list 来初始化。initializer_list 是 C++11 的语法。
#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash1; //这是无参构造unordered_map<int, int> hash2({{1,1}, {2,2}, {3,3}}); //这是使用initializer_list来构造return 0;
}

bool empty() const

这个函数用来判断哈希表是否为空,为空返回 true;否则返回 false。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash1; //这是无参构造unordered_map<int, int> hash2({{1,1}, {2,2}, {3,3}}); //这是使用initializer_list来构造cout << hash1.empty() << endl; //输出:1cout << hash2.empty() << endl; //输出:0return 0;
}

size_t size() const

这个函数用来获取哈希表中有效元素的个数。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash1; //这是无参构造unordered_map<int, int> hash2({{1,1}, {2,2}, {3,3}}); //这是使用initializer_list来构造cout << hash1.size() << endl; //输出:1cout << hash2.size() << endl; //输出:3return 0;
}

迭代器

  • begin:返回哈希表中第一个元素的位置对应的迭代器。
  • end:返回的迭代器并不指向任何元素,而是指向容器中最后一个元素之后的位置。因此,返回的值不应被取消引用。
    有了 begin 和 end 迭代器,我们就可以遍历 unordered_map 了。
#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造auto it = hash2.begin();while(it != hash2.end()){cout << it->first << " " << it->second << endl;++it;}return 0;
}

在这里插入图片描述
我们看到最后遍历得到的结果与插入的顺序并不相同。这也证明了 unordered_map 是一个无序容器。仅仅存储一个 key-value 的数据。

const V& operator[](const K& key)

这个函数和 mapoperator[] 很像。
如果 key 与容器中某个元素的键相匹配,函数会返回其映射值(value)的引用。

如果 key 与容器中任何元素的键不匹配,函数将插入一个具有该键的新元素,并返回其映射值的引用。请注意,即使没有为元素分配映射值(元素是使用默认构造函数构造的),容器的大小也会增加一个。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造cout << hash2[10] << endl; //输出:10hash2[40]; // 使用 operator[] 访问key为 40 的元素,但是不存在,会插入一个 key 为 40 的元素,value我们没有指定,那么会调用 value 类型的默认构造函数:int() 作为 40 这个 key 值的 value 值cout << hash2[40] << endl; //输出:0return 0;
}

iterator find(const K& key)

unordered_map 中查找 key,如果查找成功返回该位置对应的迭代器,如果查找失败,那么返回 unordered_map::end ,就是 end 迭代器。
下面的代码中,我们使用 find 查找一个元素,通过得到的迭代器访问他的 value。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造auto it = hash2.find(10);if(it == hash2.end()) cout << "此元素不存在" << endl;else cout << it->second << endl; //输出:10return 0;
}

size_t count(const K& key) const

搜索容器中键为 key 的元素,并返回找到的元素个数。由于 unordered_map 容器不允许键重复,这意味着如果容器中存在键为 key 的元素,函数实际返回 1,否则返回 0。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造cout << hash2.count(10) << endl; //输出:1cout << hash2.count(40) << endl; //输出:0return 0;
}

pair<iterator, bool> insert ( const pair<K, V>& kv )

这个函数和 mapinsert 完全一样。
你可以向 unordered_map 中插入一个键值对。
函数返回一个 pair 对象,其第一个元素是一个迭代器,指向容器中新插入的元素或键等价的元素,另一个 bool 值表示该元素是否插入成功。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造pair<unordered_map<int, int>::iterator, bool> ret1 = hash2.insert(make_pair(40, 40));cout << "插入成功与否:" << ret1.second << endl; //插入成功,ret1.second 为 1pair<unordered_map<int, int>::iterator, bool> ret2 = hash2.insert(make_pair(30, 0));cout << ret2.first->second << endl; //插入失败,得到的是原 key 为 30 的元素对应的 value:30 而不是新插入的 0return 0;
}

insert 函数也可以插入 initializer_list 和构造函数那里一样:
hash2.insert({60,60})

erase 函数

erase 有三个重载的版本:
在这里插入图片描述

  • 第一个版本:删除一个迭代器位置的元素。
  • 第二个版本:删除键为 k 的元素。
  • 第三个版本:删除一个迭代器区间。
#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造hash2.erase(hash2.begin()); //第一个版本hash2.erase(30); //第二个版本hash2.erase(hash2.begin(), hash2.end()); //第三个版本return 0;
}

void clear() const

清空 unordered_map 中所有的元素。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造hash2.clear();cout << hash2.size() << endl; // 输出:0return 0;
}

unordered_set

这是 unordered_set 的介绍文档:来自 cpluscplus.com。

  • unordered_set 是一种不按特定顺序存储唯一元素的容器,可以根据元素的值快速检索单个元素。

  • 在 unordered_set 中,元素的值同时也是其键,可以唯一地识别该元素。键是不可变的,因此,unordered_set 中的元素一旦进入容器就不能修改,但可以插入和移除。

  • 在内部,unordered_set 中的元素不按任何特定顺序排序,而是根据它们的哈希值组织成桶,以便直接按其值快速访问单个元素(平均时间复杂度不变)。

  • 无序集容器在按键访问单个元素时比集合容器更快,但在对元素子集进行范围迭代时,其效率通常较低。

  • 容器中的迭代器至少是前向迭代器。

unordere_set 存储的数据只有一个 key。
unordered_set 与 unordered_map 的接口完全相同。这里就不再赘述了。

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

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

相关文章

JAVA爬虫2 - Jsoup解析、对接MySQL、多线程爬虫、json库使用

官网:https://jsoup.org/download Jsoup是一款基于Java的HTML解析器,它可以方便地从网页中抓取和解析数据。它的主要作用是帮助开 发者处理HTML文档,提取所需的数据或信息。下面介绍几个常用的API: 选择器(Selector)API:用于根据CSS选择器语法选择HTML元素。 属性(Attribute…

【MySQL】宝塔面板结合内网穿透实现公网远程访问

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cpo…

BMS基础知识:BMS基本功能,铅酸和锂电池工作原理,电池系统的重要概念!

笔者有话说&#xff1a; 作为BMS从业者来讲&#xff0c;目前接触的BMS系统并不是很高大尚&#xff0c;但基础功能都是有的。 关于BMS的基本功能&#xff0c;工作原理&#xff0c;运行逻辑等&#xff0c;在此做一个梳理&#xff0c;讲一些最基础的扫盲知识&#xff0c;可以作为…

python爬虫中 HTTP 到 HTTPS 的自动转换

前言 在当今互联网世界中&#xff0c;随着网络安全的重要性日益增加&#xff0c;越来越多的网站采用了 HTTPS 协议来保护用户数据的安全。然而&#xff0c;许多网站仍然支持 HTTP 协议&#xff0c;这就给我们的网络爬虫项目带来了一些挑战。为了应对这种情况&#xff0c;我们需…

一文掌握 Spring Boot 常用注解,保姆级整理,建议收藏!

亲兄弟篇&#xff1a; SpringBoot注解大全&#xff08;超详细&#xff09;_Maiko Star的博客-CSDN博客 一、SpringBoot常用注解 二、Bean处理注解 2.1 Resource 依赖注入&#xff0c;自动导入标注的对象到当前类中&#xff0c;比如我们的 Controller 类通常要导入 Service 类…

前端编码技巧须知

前端开发中可能会使用到以下软件&#xff0c;它们各自具有不同的作用&#xff1a; 代码编辑器&#xff1a;例如Sublime Text、Atom、Visual Studio Code等&#xff0c;用于编写和编辑HTML、CSS和JavaScript等前端代码。网页浏览器&#xff1a;例如Chrome、Firefox、Safari等&a…

来聊聊JVM中的类加载过程以及双亲委派模型(学习Java必知内容)

文章目录 1. 类加载过程加载验证准备解析初始化 2. 双亲委派模型一个类的加载流程双亲委派模型的优点 总结 1. 类加载过程 在整个 JVM 执行过程中, 和我们程序员关系最密切的就是类加载的过程, 所以接下来我们来看下类加载的执行流程. 对于一个类来说, 它的生命周期是这样的:…

python pymodbus库使用教程(以Modbus RTU为例)

文档&#xff1a; https://pymodbus.readthedocs.io/en/latest/ 源码&#xff1a; https://github.com/riptideio/pymodbus/ 文章目录 Python PyModbus库使用教程&#xff1a;以Modbus RTU为例介绍安装PyModbus配置串行连接导入必要的模块创建Modbus客户端实例 建立连接连接…

UEC++ day8

伤害系统 给敌人创建血条 首先添加一个UI界面用来显示敌人血条设置背景图像为黑色半透明 填充颜色 给敌人类添加两种状态表示血量与最大血量&#xff0c;添加一个UWidegtComponet组件与UProgressBar组件 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "Enemy …

TikTok历史探秘:短视频中的时间之旅

在数字时代的浪潮中&#xff0c;TikTok崭露头角&#xff0c;成为社交媒体领域的一颗耀眼新星。这款短视频应用以其独特的创意、时尚和娱乐性质&#xff0c;吸引了全球数以亿计的用户。 然而&#xff0c;TikTok并非一夜之间的奇迹&#xff0c;它背后蕴藏着丰富而有趣的历史故事…

[ChatGPT]ChatGPT免费,不用翻墙!?——你需要的装备

系列文章目录 【AIGC】服务于人类&#xff5c;一种新的人工智能技术-CSDN博客 文章目录 目录 系列文章目录 文章目录 前言 一、天意云网站 ​编辑 二、使用步骤 可以看到有云服务器、Rstudio以及我们的ChatGPT&#xff0c;我这次主要分享ChatGPT&#xff0c;其他的有机会我再给…

常用服务注册中心与发现(Eurake、zookeeper、Nacos)笔记(一)基础概念

基础概念 注册中心 在服务治理框架中&#xff0c;通常都会构建一个注册中心&#xff0c;每个服务单元向注册中心登记自己提供的服务&#xff0c;将主机与端口号、版本号、通信协议等一些附加信息告知注册中心&#xff0c;注册中心按照服务名分类组织服务清单&#xff0c;服务…

设计师不能忽视的几个宝藏图标设计工具

在这个快速变化的时代&#xff0c;设计师对创新和实用工具的需求越来越大。这就要求我们及时跟上潮流&#xff0c;不断探索和尝试最新、最有价值的图标设计工具。只有这样&#xff0c;我们才能在竞争激烈的设计市场中脱颖而出。以下是我们精心挑选的2024年值得一试的图标设计工…

服务器安全如何保障

主机安全是指保护计算机主机&#xff08;也称为服务器、终端或主机设备&#xff09;免受潜在的安全威胁和攻击的一系列措施和实践。主机安全旨在防止未经授权的访问、数据泄露、恶意软件感染和其他安全漏洞的利用&#xff0c;主机一旦被黑客入侵&#xff0c;企业会面临很多安全…

相比其他关系型数据库,AntDB JDBC驱动特性有哪些不同之处

摘要&#xff1a;使用Java语言进行各类应用程序的快速开发成为目前比较主要且流行的开发方式。JDBC是 Java 语言中用来连接和操作关系型数据库的 API&#xff0c;在业务程序与关系型数据库通信时&#xff0c;必然会使用JDBC驱动。 本文将通过国产关系型数据库AntDB中的JDBC为大…

【Effective C++】 (六) 继承与面向对象设计

【六】继承与面向对象设计 条款32 &#xff1a; 确保public继承是"is a"的关系 Item 32: Make sure public inheritance models “is-a”. C面向对象程序设计中&#xff0c;最重要的规则便是&#xff1a;public继承应当是"is-a"的关系。当Derived public继…

【uniapp】部分图标点击事件无反应

比如&#xff1a;点击这个图标在h5都正常&#xff0c;在小程序上无反应 css&#xff1a;也设置z-index&#xff0c;padding 页面上也试过click.native.stop.prevent"changePassword()" 时而可以时而不行&#xff0c; 最后发现是手机里输入键盘的原因&#xff0c;输…

大型养殖场需要哪些污水处理设备

大型养殖场是一个涉及环境保护和可持续发展的关键行业&#xff0c;对于处理养殖场产生的污水有着明确的要求和标准。为了确保污水得到有效处理和处理效果达到国家排放标准&#xff0c;大型养殖场需要配备一系列污水处理设备。以下是几种常见的污水处理设备&#xff1a; 1. 水解…

Python入门指南之基本概率和语法基础

文章目录 一、基本概念二、控制流三、函数四、模块五、数据结构六、面向对象的编程七、输入输出八、异常九、Python标准库关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战…

快速排序演示和代码介绍

快速排序的核心是(以升序为例)&#xff1a;在待排序的数据中指定一个数做为基准数&#xff0c;把所有小于基准数的数据放到基准数的左边&#xff0c;所有大于基准数的数据放在右边&#xff0c;这样的话基准数的位置就确定了&#xff0c;然后在两边的数据中重复上述操作