【C++STL详解(十三)】unordered系列容器的介绍与使用

news2025/2/26 5:07:04

目录

前言

一、unordered_map

介绍

使用 

构造方式

修改 

容量

迭代器

元素访问

查询

桶操作 

二、unordered_set

介绍

使用

构造

修改

容量

 迭代器(只有单向)

查询

桶操作 

三、unordered系列的性能测试


前言

前面提到的map/set是C++98提供的关联式容器,底层结构是红黑树,最差情况下需要比较树得高度次,若树的结点十分多时,查询效率也不是很理想。C++11中,又提供了4个unordered系列容器,使用起来和map/set基本类似,只是底层结构不同。unordered系列底层是哈希结构(严格来说是哈希桶结构),最快的查询可以达到O(1)。

一、unordered_map

介绍

  • unordered_map是存储<key,value>键值对的关联式容器,KV模型
  • 键值key通常用于惟一地标识元素(不存在相同元素),而映射值是一个对象,其内容与此
    键关联。键和映射值的类型可能不同。
  • 内部没有任何的排序,是无序的,这点和map的最大区别,map有序
  • unordered_map通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭
    代方面效率较低。
  • 同样也支持operator【】访问
  • 底层是哈希桶结构
  • 迭代器是单向的,因为底层结构

使用 

使用上和map可以说是基本类似了!除了迭代器

构造方式

	unordered_map<string, int> m;//无参构造
	unordered_map<string, int> m1(m);//拷贝构造
	unordered_map<string, int> m2(m1.begin(), m1.end());//迭代器区间构造

	//初始化列表构造
	unordered_map<string, int> m3 ={ { "aa", 2 }, { "bb",3 } };

修改 

insert向容器中插入键值对
erase删除键值对
clear清空元素
swap交换两个容器内容
	unordered_map<int, int> m;//无参构造
	vector<int> a = {3,6,9,4,2,10};
	for (auto b : a)
	{
		m.insert({ b,b });
	}
	m.erase(3);
	unordered_map<int, int> m1;
	m.swap(m1);

	m.clear();

容量

	unordered_map<string, int> m3 ={ { "aa", 2 }, { "bb",3 } };
	m3.empty();//判空
	m3.size();//大小

迭代器

begin()返回第一个元素的迭代器
end()返回最后一个元素的下一个位置的迭代器
cbegin()返回第一个元素的const迭代器
cend()返回最后一个元素的下一个位置的const迭代器
	unordered_map<string, int> m3 ={ { "aa", 2 }, { "bb",3 } };
	auto it = m3.begin();
	while (it!=m3.end())
	{
		cout << it->first << ":" << it->second << endl;
		++it;
	}

 注意:这个系列只提供单向迭代器!!

元素访问

operator【】:返回key对应的value的引用,和map一样!功能强大,既能插入又能修改!

	unordered_map<string, int> m3 ={ { "aa", 2 }, { "bb",3 } };
	m3["aa"] = 4;

查询

iterator find ( const key_type& k )放回key在哈希桶的位置
size_type count ( const key_type& k ) const;返回哈希桶中关键码为key的个数

注意:Key是唯一的,不允许重复,所以count为0/1!

	auto it = m3.find("aa");
	m3.count("aa");

桶操作 

bucket_count()返回桶的个数
bucket_size(n)返回n号桶中有效元素的总个数
bucket(key)返回元素key所在的桶号

二、unordered_set

介绍

  • unordered_set是存储key的关联式容器,K模型,底层可以看出<key,key>
  • 键值key通常用于惟一地标识元素(不存在相同元素)
  • 内部没有任何的排序,是无序的,这点和set的最大区别,set有序
  • unordered_set通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭
    代方面效率较低。
  • 底层是哈希桶结构
  • 迭代器是单向的,因为底层结构

使用

构造

和set基本一样,这里直接看实例就好了!

	unordered_set<int> s;//无参
	unordered_set<int> s1(s);//拷贝

	vector<int> a = { 3,6,9,4,2,10,3 };
	unordered_set<int> s2(a.begin(),a.end());//迭代区间
	//初始化列表
	unordered_set<int> s3 = { 6,7,1,2,4,9,10 };

修改

	unordered_set<int> m;//无参构造
	vector<int> a = {3,6,9,4,2,10};
	for (auto b : a)
	{
		m.insert(b);
	}
	m.erase(3);
	unordered_set<int> m1;
	m.swap(m1);
	m.clear();

容量

	unordered_set<int> s3 = { 3,6,9,4,2,10,3 };
	s3.size();
	s3.empty();

 迭代器(只有单向)

	unordered_set<int> s3 = { 3,6,9,4,2,10,3 };
	auto it = s3.begin();
	while (it != s3.end())
	{
		cout << *it << endl;
		++it;
	}

查询

auto it = s3.find(3);
s3.count(3);// 0/1

桶操作 

bucket_count()返回桶的个数
bucket_size(n)返回n号桶中有效元素的总个数
bucket(key)返回元素key所在的桶号
	cout << s3.bucket_count() << endl;//统计桶的总数
	cout << s3.bucket_size(3) << endl;//返回3号桶中的数据个数
	cout << s3.bucket(3) << endl;//放回3所在的桶号

注意:还有两个容器这里就不过多介绍了,这几个容器使用起来差别不算很大,也比较简单,大家可以点击unordered_multiset和unordered_multimap查看,区别就是multi系列可以存在重复元素

三、unordered系列的性能测试

void test_set2()
{
	const size_t N = 1000000;
	unordered_set<int> us;
	set<int> s;

	vector<int> v;
	v.reserve(N);
	srand(time(0));
	for (size_t i = 0; i < N; ++i)
	{
		//v.push_back(rand()); // N比较大时,重复值比较多
		//v.push_back(rand()+i); // 重复值相对少
		v.push_back(i); // 没有重复,有序
	}

	size_t begin1 = clock();
	for (auto e : v)
	{
		s.insert(e);
	}
	size_t end1 = clock();
	cout << "set insert:" << end1 - begin1 << endl;

	size_t begin2 = clock();
	for (auto e : v)
	{
		us.insert(e);
	}
	size_t end2 = clock();
	cout << "unordered_set insert:" << end2 - begin2 << endl;

	int m1 = 0;
	size_t begin3 = clock();
	for (auto e : v)
	{
		auto ret = s.find(e);
		if (ret != s.end())
		{
			++m1;
		}
	}
	size_t end3 = clock();
	cout << "set find:" << end3 - begin3 << "->" << m1 << endl;

	int m2 = 0;
	size_t begin4 = clock();
	for (auto e : v)
	{
		auto ret = us.find(e);
		if (ret != us.end())
		{
			++m2;
		}
	}
	size_t end4 = clock();
	cout << "unorered_set find:" << end4 - begin4 << "->" << m2 << endl;

	cout << "插入数据个数:" << s.size() << endl;
	cout << "插入数据个数:" << us.size() << endl << endl;

	size_t begin5 = clock();
	for (auto e : v)
	{
		s.erase(e);
	}
	size_t end5 = clock();
	cout << "set erase:" << end5 - begin5 << endl;

	size_t begin6 = clock();
	for (auto e : v)
	{
		us.erase(e);
	}
	size_t end6 = clock();
	cout << "unordered_set erase:" << end6 - begin6 << endl << endl;

}

int main()
{
	test_set2();
	//test_map1();
	return 0;
}

大家可以copy到自己的编译器看看其他不同的结果,上述代码的结果如下:

可以看到unordered系列查找的速度确实快啊!因为底层的结构。


如果对你有那么一点帮助,欢迎点赞+收藏哦!

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

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

相关文章

使用手机挖掘IDOR漏洞赚取1500美元赏金

在今天的文章中&#xff0c;笔者将分享如何在手机上发现两个不安全的直接对象引用 (IDOR) 实例&#xff0c;并因此获得 1500 美元的赏金。 信息收集&#xff1a;了解目标 首先&#xff0c;我通常使用 Google dork&#xff08;谷歌语法&#xff1a;如“site:target.com about”…

斯坦福UE4 C++课学习补充24:伤害数值

创建并调用数值显示UI 显示数值用UMG实现。创建名为DamagePopup_Widget控件蓝图&#xff0c;添加一个数值文本框。设置如下&#xff0c;设置文本框为Is Variable 将场景投射到屏幕Project World Location to Widget Position节点&#xff1a;它的作用是在UE中将一个世界空间中…

智能新未来:2024世界机器人大会全景解析

8月21日至25日&#xff0c;2024世界机器人大会在北京北人亦创国际会展中心盛大举行。本次大会以“共育新质生产力 共享智能新未来”为主题&#xff0c;汇聚了全球近170家机器人企业&#xff0c;展示了超过600款创新产品&#xff0c;其中首发新品达60余款&#xff0c;人形机器人…

晚宴扫码查询座位号

在晚宴活动中&#xff0c;快速准确地查询座位号是提升参与者体验的关键。以下是通过扫码查询系统实现座位号查询的详细步骤。 步骤一&#xff1a;电脑端上传查询信息 1. 访问云分组官网。 2. 使用微信扫码登录系统。 3. 点击菜单“我的查询”。 步骤二&#xff1a;准备查询信…

文心快码帮你解大厂面试题:如何使用shell找到access log,如何找到访问量最多的url?

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; 【大厂面试真题】系列&#xff0c;带你攻克大厂面试真题&#xff0c;秒变offer收割机&#xff01; ❓今日问题&#xff1a;在8…

Java框架spring(二)

一、AOP面向切面编程 1、AOP的概念 AOP&#xff08;AspectOrientedProgramming&#xff09;&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过 预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 AOP是OOP的延续&#xff0c;是软件开发中的一个热点&…

URP custompasscustom render objects 下

上文 https://blog.csdn.net/qq_35158695/article/details/141708043?spm1001.2014.3001.5501 上次说了绘制流程&#xff0c;还需要指定FBO 在renderpass的这个configure函数里&#xff0c;设置render target 这里的纹理是从shader里map出来的ID&#xff0c;不过我看他文章没…

STM32F1+HAL库+FreeTOTS学习7——列表和列表项

STM32F1HAL库FreeTOTS学习7——列表和列表项 列表和列表项简介列表列表项迷你列表项 列表项API函数介绍1. 初始化列表2. 初始化列表项3. 列表末尾插入列表项4. 列表插入列表项5. 移除列表项6. 补充&#xff1a;FreeRTOS中操作列表和列表项的宏 列表项的插入和删除实验总结 上一…

人工智能时代,AI数据服务行业面临的机遇与挑战

随着大数据、云、物联网、人工智能等信息科技技术的发展以及互联网设备的普及&#xff0c;各行业产生了前所未有海量的AI数据服务需求&#xff0c;彻底宣告了数据时代的来临。 首先&#xff0c;物联网的发展更使线下业务产生的大量数据被采集起来&#xff0c;世界各地的AI数据…

需求管理软件对比:2024年10款推荐工具

本文将介绍10款需求管理软件&#xff1a;1.PingCode&#xff1b;2. Worktile&#xff1b;3. 开源中国社区 Gitee&#xff1b;4. 金动力&#xff1b;5. 氚云&#xff1b;6. 协作云&#xff1b;7. 麦塔在线&#xff1b;8. Height&#xff1b;9. Plaky&#xff1b;10. ActiveColla…

万龙觉醒辅助:屠龙攻略大全!VMOS云手机带你组团抓龙!

在《万龙觉醒》中&#xff0c;使用VMOS云手机能够为玩家提供专属定制版的云手机&#xff0c;不仅内置游戏安装包&#xff0c;还无需重新下载安装游戏。这一切都让玩家的游戏体验更加便捷和高效。VMOS云手机能够辅助游戏的自动化运行&#xff0c;支持24小时云端运行&#xff0c;…

论文《Adversarial Examples on Graph Data: Deep Insights into Attack and Defense》笔记

【IG-Attack 2019 IJCAI】本文提出了一种基于integrated gradients的对抗攻击和防御算法。对于攻击&#xff0c;本文证明了通过引入integrated gradients可以很容易解决离散问题&#xff0c;integrated gradients可以准确反映扰动某些特征或边的影响&#xff0c;同时仍然受益于…

【并发编程】从AQS机制到同步工具类

AQS机制 Java 中常用的锁主要有两类&#xff0c;一种是 Synchronized 修饰的锁&#xff0c;被称为 Java 内置锁或监视器锁。另一种就是在 JUC 包中的各类同步器&#xff0c;包括 ReentrantLock&#xff08;可重入锁&#xff09;、Semaphore&#xff08;信号量&#xff09;、Co…

走出新手村,软件测试银行项目怎么测试 + 面试题(答案)

前言 业务&#xff1a; 银行类app具体模块业务讲解&#xff1a; 掌上生活&#xff08;消费/理财&#xff09; 消费&#xff1a; 与电商平台业务类似 饭票&#xff1a;GPS定位城市服务、饭票购买消费、餐厅查询、代金券、周三五折、banner图、我的饭票、我的抵扣券 影票 …

RKNPU2从入门到实践 ---- 【9】使用RKNPU2的C API接口将RKNN模型部署在RK3588开发板上

注&#xff1a;作者使用的平台为Ubuntu20.04虚拟系统&#xff0c;开发板为RK3588&#xff0c;开发板上面的系统为Ubuntu22.04。 前言 本博文我们要学习使用 RKNPU2 提供的 C API 接口将RKNN模型部署在RK3588开发板上&#xff0c;完成测试图片在开发板上的推理工作。C API接口…

【书生3.2】Lagent 自定义你的 Agent 智能体

Lagent 自定义你的 Agent 智能体 1 环境准备2 启动模型3 部署lagent4 可视化页面及配置5 自定义工具的智能体 1 环境准备 直接复用之前的xtuner或者llamaindex环境 # 安装其他依赖包 conda activate llamainde pip install termcolor2.4.0 pip install lmdeploy0.5.2pip inst…

Gazebo Harmonic gz-harmonic 和 ROS2 Jazzy 思考题 建图和导航 SLAM Navigation

仿真 效果还挺好的。 SLAM建图 SLAM 仿真测试录屏 配置环境 Gazebo Harmonic ROS Jazzy 导航 …… 提示 这篇文档详细介绍了如何在ROS 2环境中使用SLAM&#xff08;Simultaneous Localization and Mapping&#xff0c;即同时定位与地图构建&#xff09;和Nav2&#xff08;N…

XXE-labs靶场通关攻略

环境地址自行查找 1.寻找靶机地址 使用工具goby进行扫描 因为我的靶场是搭在ubuntu上 直接查找系统是Ubuntu的就可以找到 靶机IP 172.16.1.183 2.访问靶场 3.使用目录扫描工具进行扫描 使用kali自带的dirsearch进行扫描 可以看到一个robots.txt文件 4.访问robots.txt文件 …

白夜剧场再出爆款《边水往事》,这次能“带飞”优酷吗?

这个暑期档&#xff0c;优酷靠着白夜剧场悬疑新作《边水往事》再下一城。 谁能想到刚开播时无人问津的《边水往事》竟然“爆”了&#xff0c;8月16日首播当天市占率仅仅1.73%&#xff0c;播放量不到700万&#xff0c;而在上线第十天&#xff0c;《边水往事》终于逆袭夺冠&…

#QT 笔记一

重点&#xff1a;面试考试大概率涉及&#xff0c;需要不借助任何资料掌握。掌握&#xff1a;面试考试可能涉及&#xff0c;需要不借助任何资料掌握。熟悉&#xff1a;面试考试可能涉及&#xff0c;可以稍微参考资料掌握。了解&#xff1a;面试考试小概率涉及&#xff0c;面试拔…