C++ —— unordered_set、unordered_map的介绍及使用

目录

unordered系列关联式容器

unordered_set的介绍

unordered_set的使用

unordered_set的定义方式

unordered_set接口的使用

unordered_multiset

unordered_map的介绍

unordered_map的使用 

unordered_map的定义方式

unordered_map接口的使用 

unordered_multimap 


unordered系列关联式容器

在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时的效率可达到O ( l o g N ) O(logN)O(logN),即最差情况下需要比较红黑树的高度次,当树中的结点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同。

unordered_set的介绍

1.unordered_set是不按特定顺序存储键值的关联式容器,其允许通过键值快速的索引到对应的元素。
2.在unordered_set中,元素的值同时也是唯一地标识它的key。
在内部,unordered_set中的元素没有按照任何特定的顺序排序,为了能在常数范围内找到指定的3.key,unordered_set将相同哈希值的键值放在相同的桶中。
4.unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。
它的迭代器至少是前向迭代器。

unordered_set的使用

unordered_set的定义方式

方式一: 构造一个某类型的空容器。

unordered_set<int> us1; //构造int类型的空容器

方式二: 拷贝构造某同类型容器的复制品。

unordered_set<int> us2(us1); //拷贝构造同类型容器us1的复制品

方式三: 使用迭代器拷贝构造某一段内容。

string str("abcedf");
unordered_set<char> us3(str.begin(), str.end()); //构造string对象某段区间的复制品

定义unordered_set的一般方式如下:

#include <unordered_set>
#include <iostream>int main() {// 定义一个存储int类型元素的unordered_setstd::unordered_set<int> mySet;// 插入元素mySet.insert(1);mySet.insert(2);mySet.insert(3);// 打印元素for (const auto& elem : mySet) {std::cout << elem << " ";}return 0;
}

unordered_set接口的使用

unordered_set当中常用的成员函数如下:

unordered_set当中迭代器相关函数如下:

 

使用示例:

#include <iostream>
#include <unordered_set>using namespace std;int main() {unordered_set<int> us;// 插入元素(自动去重)us.insert(1);us.insert(4);us.insert(3);us.insert(3); // 重复元素,不会插入us.insert(2);us.insert(2); // 重复元素,不会插入us.insert(3); // 重复元素,不会插入// 遍历容器方式一(范围for)for (auto e : us) {cout << e << " ";}cout << endl; // 1 4 3 2(元素顺序可能会不同,因为是无序的)// 删除元素方式一us.erase(3); // 删除值为3的元素// 删除元素方式二unordered_set<int>::iterator pos = us.find(1); // 查找值为1的元素if (pos != us.end()) {us.erase(pos); // 删除找到的元素}// 遍历容器方式二(迭代器遍历)unordered_set<int>::iterator it = us.begin();while (it != us.end()) {cout << *it << " ";it++;}cout << endl; // 4 2(元素顺序可能会不同,因为是无序的)// 容器中值为2的元素个数cout << us.count(2) << endl; // 1// 容器大小cout << us.size() << endl; // 2// 清空容器us.clear();// 容器判空cout << us.empty() << endl; // 1(true)// 交换两个容器的数据unordered_set<int> tmp{11, 22, 33, 44};us.swap(tmp);for (auto e : us) {cout << e << " ";}cout << endl; // 11 22 33 44(元素顺序可能会不同,因为是无序的)return 0;
}

unordered_multiset

unordered_multiset容器与unordered_set容器的底层数据结构是一样的,都是哈希表,其次,它们所提供的成员函数的接口都是基本一致的,这里就不再列举了,这两种容器唯一的区别就是,unordered_multiset容器允许键值冗余,即unordered_multiset容器当中存储的元素是可以重复的。

#include <iostream>
#include <unordered_set>
using namespace std;int main()
{unordered_multiset<int> ums;//插入元素(允许重复)ums.insert(1);ums.insert(4);ums.insert(3);ums.insert(3);ums.insert(2);ums.insert(2);ums.insert(3);for (auto e : ums){cout << e << " ";}cout << endl; //1 4 3 3 3 2 2return 0;
}

由于unordered_multiset容器允许键值冗余,因此该容器中成员函数find和count的意义与unordered_set容器中的也有所不同:

 

unordered_map的介绍

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

unordered_map的使用 

unordered_map的定义方式

方式一: 指定key和value的类型构造一个空容器。

unordered_map<int, double> um1; //构造一个key为int类型,value为double类型的空容器

方式二: 拷贝构造某同类型容器的复制品。

unordered_map<int, double> um2(um1); //拷贝构造同类型容器um1的复制品

方式三: 使用迭代器拷贝构造某一段内容。

unordered_map<int, double> um3(um2.begin(), um2.end()); //使用迭代器拷贝构造um2容器某段区间的复制品

示例如下

#include <unordered_map>
#include <iostream>int main() {// 定义一个键为string类型,值为int类型的unordered_mapstd::unordered_map<std::string, int> myMap;// 插入键值对myMap["one"] = 1;myMap["two"] = 2;myMap["three"] = 3;// 打印键值对for (const auto& pair : myMap) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}

unordered_map接口的使用 

unordered_map当中常用的成员函数如下:

除了上述的成员函数之外,unordered_map容器当中还实现了[ ]运算符重载函数,该重载函数的功能非常强大:[key]

1.若当前容器中已有键值为key的键值对,则返回该键值对value的引用。
2.若当前容器中没有键值为key的键值对,则先插入键值对<key, value()>,然后再返回该键值对中value的引用。
unordered_map当中迭代器相关函数如下:

示例如下:

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;int main()
{unordered_map<int, string> um;//插入键值对方式一:构造匿名对象插入um.insert(pair<int, string>(1, "one"));um.insert(pair<int, string>(2, "two"));um.insert(pair<int, string>(3, "three"));//遍历方式一:范围forfor (auto e : um){cout << e.first << "->" << e.second << " ";}cout << endl; //1->one 2->two 3->three//插入键值对方式二:调用make_pair函数模板插入um.insert(make_pair(4, "four"));um.insert(make_pair(5, "five"));um.insert(make_pair(6, "six"));//遍历方式二:迭代器遍历unordered_map<int, string>::iterator it = um.begin();while (it != um.end()){cout << it->first << "->" << it->second << " ";it++;}cout << endl; //1->one 2->two 3->three 4->four 5->five 6->six//插入键值对方式三:利用[]运算符重载函数进行插入(常用)um[7] = "seven";um[8] = "eight";um[9] = "nine";for (auto e : um){cout << e.first << "->" << e.second << " ";}cout << endl; //9->nine 1->one 2->two 3->three 4->four 5->five 6->six 7->seven 8->eight//删除键值对方式一:根据key值删除um.erase(5);//删除键值对方式二:根据迭代器删除unordered_map<int, string>::iterator pos = um.find(7); //查找键值为7的键值对if (pos != um.end()){um.erase(pos);}for (auto e : um){cout << e.first << "->" << e.second << " ";}cout << endl; //9->nine 1->one 2->two 3->three 4->four 6->six 8->eight//修改键值对方式一:通过find获得迭代器,通过迭代器修改pos = um.find(1);if (pos != um.end()){pos->second = "one/first";}//修改键值对方式二:利用[]运算符重载函数进行修改(常用)um[2] = "two/second";for (auto e : um){cout << e.first << "->" << e.second << " ";}cout << endl; //9->nine 1->one/first 2->two/second 3->three 4->four 6->six 8->eight//容器中key值为3的键值对的个数cout << um.count(3) << endl;//容器的大小cout << um.size() << endl;//清空容器um.clear();//容器判空cout << um.empty() << endl;//交换两个容器的数据unordered_map<int, string> tmp{ { 2021, "before" }, { 2022, "now" } };um.swap(tmp);for (auto e : um){cout << e.first << "->" << e.second << " ";}cout << endl; //2021->before 2022->nowreturn 0;
}

unordered_multimap 

unordered_multimap容器与unordered_map容器的底层数据结构是一样的,都是哈希表,其次,它们所提供的成员函数的接口都是基本一致的,这里就不再列举了,这两种容器唯一的区别就是,unordered_multimap容器允许键值冗余,即unordered_multimap容器当中存储的键值对的key值是可以重复的。

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;int main()
{unordered_multimap<int, string> umm;//插入键值对(允许键值重复)umm.insert(make_pair(2022, "吃饭"));umm.insert(make_pair(2022, "睡觉"));umm.insert(make_pair(2022, "敲代码"));for (auto e : umm){cout << e.first << "->" << e.second << " ";}cout << endl; //2022->吃饭 2022->睡觉 2022->敲代码return 0;
}

由于unordered_multimap容器允许键值对的键值冗余,因此该容器中成员函数find和count的意义与unordered_map容器中的也有所不同:

 

 

其次,由于unordered_multimap容器允许键值对的键值冗余,调用[ ]运算符重载函数时,应该返回键值为key的哪一个键值对的value的引用存在歧义,因此在unordered_multimap容器当中没有实现[ ]运算符重载函数。 

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

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

相关文章

智慧校园发展趋势:2024年及未来教育科技展望

展望2024年及未来的教育科技领域&#xff0c;智慧校园的发展正引领着一场教育模式的深刻变革&#xff0c;其核心在于更深层次地融合技术与教育实践。随着人工智能技术的不断成熟&#xff0c;个性化学习将不再停留于表面&#xff0c;而是深入到每个学生的个性化需求之中。通过精…

密钥管理简介

首先我们要知道什么是密钥管理&#xff1f; 密钥管理是一种涉及生成、存储、使用和更新密钥的过程。 密钥的种类 我们知道&#xff0c;对称密码主要包括分组密码和序列密码。但有时也可以将杂凑函数和消息认证码划分为这一类&#xff0c;将它们的密钥称为对称密钥&#xff1b;…

白酒:酒文化的地域特色与差异

中国的白酒文化&#xff0c;作为一种深深植根于人们生活中的文化现象&#xff0c;其发展历程深受地域特色的影响&#xff0c;从而形成了丰富多样的地域特色与差异。云仓酒庄的豪迈白酒&#xff0c;作为中国白酒的品牌&#xff0c;其背后所蕴含的地域特色与差异更是值得我们去探…

在 Ubuntu 18.04.4 LTS上安装 netmap

文章目录 步骤运行配置文件编译安装使用netmap 步骤 sudo su sudo apt-get update sudo apt install build-essential sudo apt-get install -y git sudo apt-get install -y linux-headers-$(uname -r)rootVM-20-6-ubuntu:/home/ubuntu/netmap/LINUX# git clone https://gith…

外观模式(大话设计模式)C/C++版本

外观模式 C #include <iostream> using namespace std;class stock1 { public:void Sell(){cout << "股票1卖出" << endl;}void Buy(){cout << "股票1买入" << endl;} };class stock2 { public:void Sell(){cout << …

el-cascader 支持多层级,多选(可自定义限制数量),保留最后一级

多功能的 el-cascader 序言&#xff1a;最近遇到一个需求关于级联的&#xff0c;有点东西&#xff0c;这里是要获取某个产品类型下的产品&#xff0c;会存在产品类型和产品在同一级的情况&#xff0c;但是产品类型不能勾选&#xff1b; 情况1&#xff08;二级菜单是产品&…

【mysql】排错和调优

通用的一些排错方法。 1、查看进程信息 mysql> show full processlist;mysql> show processlist; 2、information_schema information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名&#xff0c;数据库的表&#xff0c;表栏的数据类型与访问权限等。…

DDP算法之反向传播(Backward Pass)

DDP算法反向传播 在DDP(Differential Dynamic Programming)算法中,反向传播(Backward Pass)是关键步骤之一。这个步骤的主要目的是通过动态规划递归地计算每个时间步上的值函数和控制策略,以便在前向传播(Forward Pass)中使用。 反向传播的目标 反向传播的主要目标是…

AD层次原理图绘制

一、在原理图中添加端口 二、添加层次图 三、更新层次图 四、也可以先画层次图&#xff0c;再绘制原理图&#xff0c;这里就不做演示了

vue3+ts 使用vue3-ace-editor实现Json编辑器

1、效果图 输入代码&#xff0c;点击格式化就出现以上效果&#xff0c;再点击压缩&#xff0c;是以下效果2、安装 npm i vue3-ace-editor 3、使用 新建aceConfig.js文件 // ace配置&#xff0c;使用动态加载来避免第一次加载开销 import ace from ace-builds// 导入不同的主…

快速定制新人入职,可以自动回答知识库问题的机器人 | Chatopera

定制智能对话机器人&#xff0c;比如我是 HR&#xff0c;想要做一个聊天机器人&#xff0c;帮助新人入职&#xff0c;自动回答知识库的问题。 注册 Chatopera 云服务 首先&#xff0c;您需要一个 Chatopera 云服务账户&#xff0c;然后根据下面四个步骤实现。 服务注册地址&…

UnityAPI学习之碰撞检测与触发检测

碰撞检测 发生碰撞检测的前提&#xff1a; 1. 碰撞的物体需要有Rigidbody组件和boxcllidder组件 2. 被碰撞的物体需要有boxcollider组件 示例1&#xff1a;被碰撞的物体拥有Rigidbody组件 两个物体会因为都具有刚体的组件而发生力的作用&#xff0c;如下图所示&#xff0c…

创建一个electron桌面备忘录

Sound Of Silence 1.创建electron项目命令&#xff1a; npm create quick-start/electron my-new-project 2选择&#xff1a;√ Select a framework: vue √ Add TypeScript? ... No √ Add Electron updater plugin? ... Yes √ Enable Electron download mirror proxy? .…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 身高差值排序(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

22种常用设计模式示例代码

文章目录 创建型模式结构型模式行为模式 仓库地址https://github.com/Xiamu-ssr/DesignPatternsPractice 参考教程 refactoringguru设计模式-目录 创建型模式 软件包复杂度流行度工厂方法factorymethod❄️⭐️⭐️⭐️抽象工厂abstractfactory❄️❄️⭐️⭐️⭐️生成器bui…

如何配置node.js环境

文章目录 step1. 下载node.js安装包step2. 创建node_global, node_cache文件夹step3.配置node环境变量step3. cmd窗口检查安装的node和npm版本号step4. 设置缓存路径\全局安装路径\下载镜像step5. 测试配置的nodejs环境 step1. 下载node.js安装包 下载地址&#xff1a;node.js…

application/x-www-form-urlencoded和json的区别

application/x-www-form-urlencoded 和 application/json 是两种不同的数据格式&#xff0c;常用于HTTP请求中传递数据。 它们各自的特点和使用场景如下&#xff1a; 1. application/x-www-form-urlencoded •特点&#xff1a;这是一种传统的表单提交时采用的编码类型&#x…

24年新版!这份Excel+Python飞速搞定数据分析手册,简直可以让Excel飞起来

前⾔ 微软在 UserVoice 上运营着⼀个反馈论坛&#xff0c;每个⼈都可以在这⾥提交新点⼦供他⼈投票。票数最⾼的功能请求是“将 Python 作为Excel 的⼀门脚本语⾔”&#xff0c;其得票数差不多是第⼆名的两倍。尽管⾃2015 年这个点⼦发布以来并没有什么实质性进展&#xff0c;…

Java基础学习-算术运算符-案例

目录 运算符&#xff1a; 表达式&#xff1a; 简单练习&#xff1a; 案例&#xff1a;拆分 数字运算注意点 隐式转换&#xff08;自动类型提升&#xff09;&#xff1a; 强制转换&#xff1a; 字符串操作&#xff1a; 字符&#xff1a; 运算符&#xff1a; 对字面量或…