C++基础语法——unordered_map和unordered_set

news2025/1/21 5:56:47

1. unordered系列关联式容器

在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log(N),即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对unordered_map和unordered_set进行介绍,unordered_multimap和unordered_multiset则与之前的multimap和multiset相似,这里就不做介绍。

2.unordered_map

①unordered_map的简介

源文档如下

大致翻译如下

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的构造

文档如下

③unordered_map的容量

文档如下

④unordered_map的迭代器

文档如下

⑤unordered_map的元素访问

文档如下

⑥unordered_map的查询

文档如下

⑦unordered_map的修改

文档如下

⑧unordered_map的桶操作

文档如下

注: unordered_set与其类似用法将在使用中举出。

3.使用与对比测试

#include<iostream>
#include<unordered_set>
#include<unordered_map>
#include<set>
using namespace std;

// 使用测试

int main()
{
	// 去重
	unordered_set<int> us;
	us.insert(3);
	us.insert(1);
	us.insert(3);
	us.insert(4);
	us.insert(5);
	us.insert(0);

	unordered_set<int>::iterator it = us.begin();
	while (it != us.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	unordered_map<string, string> dict;
	dict["sort"] = "排序";
	dict["insert"] = "插入";
	dict["string"] = "字符串";
	dict["left"];

	for (auto& kv : dict)
	{
		cout << kv.first << ":" << kv.second << endl;
	}
	cout << endl;

	return 0;
}

 效率测试
//
//int main()
//{
//	const size_t N = 100000;
//
//	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());
//		//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;
//
//
//	size_t begin3 = clock();
//	for (auto e : v)
//	{
//		s.find(e);
//	}
//	size_t end3 = clock();
//	cout << "set find:" << end3 - begin3 << endl;
//
//	size_t begin4 = clock();
//	for (auto e : v)
//	{
//		us.find(e);
//	}
//	size_t end4 = clock();
//	cout << "unordered_set find:" << end4 - begin4 << endl << 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;
//	
//	return 0;
//}

运行如下

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

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

相关文章

【16】c++设计模式——>建造者(生成器)模式

什么是建造者模式? 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许你构造复杂对象步骤分解。你可以不同的步骤中使用不同的方式创建对象&#xff0c;且对象的创建与表示是分离的。这样&#xff0c;同样的构建过程可以创建不同的表…

python pygame入门 - 安装测试篇

pygame入门 - 安装篇 引言一、安装测试1.1 创建虚拟环境1.2 安装测试pygame 二、查看例程源码2.1 源码位置2.2 简单修改 引言 pygame是Python语言特别为游戏开发而设计的一个开源库。它提供了一系列模块和函数&#xff0c;可以帮助开发者快速构建2D游戏、多媒体应用程序和其他…

Electronjs入门-Electron中的主要模块

在本节中&#xff0c;我们将了解在Electron中创建任何应用程序时的一些基本模块&#xff1b;这些模块多种多样&#xff0c;使我们能够轻松地进行进程通信&#xff0c;创建操作系统的本地菜单。 为了利用Electron模块&#xff0c;以及任何第三方或Node模块&#xff0c;不仅在主流…

10.3倒水问题(几何图论建模)

坐标图中每一个位置都对应一个合法的状态&#xff0c;BC对5升杯子做出限制&#xff0c;AD对9升杯子作出限制 每次倒水&#xff0c;都只能把目标杯子装满&#xff0c;否则无法确定倒出水的多少与目标杯子此时水的容量 所以例如&#xff0c;倒5升杯子时&#xff0c;只能要么把5…

盘点网安最好入手的10大岗位,就业转行必看

前言 前段时间&#xff0c;知名机构麦可思研究院发布了《2022年中国本科生就业报告》&#xff0c;其中详细列出近五年的本科绿牌专业&#xff0c;信息安全位列第一。 对于网络安全的发展与就业前景已经说过很多&#xff0c;它是收入较高的岗位之一&#xff0c;在转行领域也占…

IO流 之 打印流( PrintStream 和 PrintWriter )

打印流可以实现更加方便的打印数据出去&#xff0c;可以实现打印啥就是啥 PrintStream字节打印流 代码演示&#xff0c;将字符串和其他类型&#xff0c;打印到f.txt文件中。 package day0927;import java.io.FileNotFoundException; import java.io.PrintStream; import java…

伟大不能被计划

假期清理书单&#xff0c;把这个书读完了&#xff0c;结果发现出奇的好&#xff0c;可以说是值得亲身去读的书&#xff0c;中间的一些论述提供了人工智能专业方面的视角来论证这这个通识观点&#xff0c;可信度很不错&#xff1b; 这篇blog也不是对书的总结&#xff0c;更多的是…

LLMs 奖励剥削 RLHF: Reward hacking

让我们回顾一下你到目前为止所学到的内容。RLHF是一个微调过程&#xff0c;用于使LLM与人类偏好保持一致。在这个过程中&#xff0c;您利用奖励模型来评估LLM对提示数据集的完成情况&#xff0c;根据人类偏好指标&#xff08;如有帮助或无帮助&#xff09;进行评估。 接下来&…

软件设计开发笔记6:基于QT的Modbus RTU从站

Modbus是一种常见的工业系统通讯协议。在我们的设计开发工作中经常使用到它。作为一种主从协议&#xff0c;在上一篇我们实现了Mobus RTU主站工具&#xff0c;接下来这一篇中我们将简单实现一个基于QT的Mobus RTU从站工具。 1、概述 Modbus RTU从站应用很常见&#xff0c;有一…

山西电力市场日前价格预测【2023-10-07】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-07&#xff09;山西电力市场全天平均日前电价为422.87元/MWh。其中&#xff0c;最高日前电价为1500.00元/MWh&#xff0c;预计出现在18: 15-18: 45。最低日前电价为221.56元/MWh&#x…

【JavaEE】_HTTP请求与HTTP响应

目录 1. HTTP协议 2. HTTP请求 2.1 HTTP请求首行 2.2 URL 2.3 HTTP方法 2.3.1 GET请求 2.3.2 POST请求 2.3.3 GET与POST的区别 2.3.4 其他方法 2.4 请求报头header 2.4.1 Host&#xff1a; 2.4.2 Content-Length与Content-Type&#xff1a; 2.4.3 User-Agent&…

JavaScript系列从入门到精通系列第十七篇:JavaScript中的全局作用域

文章目录 前言 1&#xff1a;什么叫作用域 一&#xff1a;全局作用域 1&#xff1a;全局变量的声明 2&#xff1a;变量声明和使用的顺序 3&#xff1a;方法声明和使用的顺序 前言 1&#xff1a;什么叫作用域 可以起作用的范围 function fun(){var a 1; } fun();consol…

练[ZJCTF 2019]NiZhuanSiWei

[ZJCTF 2019]NiZhuanSiWei 文章目录 [ZJCTF 2019]NiZhuanSiWei掌握知识解题思路代码分析1代码分析2 关键paylaod 掌握知识 ​ data伪协议和php伪协议的使用&#xff0c;反序列化&#xff0c;代码审计&#xff0c;文件包含,file_get_contents函数绕过 解题思路 打开题目链接&…

【计算机操作系统慕课版】第二章:进程的控制与描述

注&#xff1a;博主斥巨资买到了2021版本慕课版的pdf 如果需要的话可以来私聊我哦~ 操作系统第二章知识点目录&#xff1a; 一、前言&#xff1a;前驱图与程序执行 1.1前驱图&#xff08;看箭头就行&#xff0c;名字高级&#xff0c;底层简单&#xff09; 1.2程序顺序执行 1…

Umijs介绍

今天我们来看 umijs 我们访问官网 https://umijs.org/ 这是一个可 插拔的企业级 React框架 当然 你也可以选择 React 的一个脚手架 但是 这样就有很多需要考虑的东西 用这个umi 很多点 我们就不需要考虑了 框架已经帮我们配置好了 这边 我们点击快速上手的一个 指南 我们可…

vue-img-cutter 实现图片裁剪[vue 组件库]

借助 vue-img-cutter 可以在网页端实现图片裁剪功能&#xff0c;最终功能效果如下&#xff1a; 组件 npm 安装 npm install vue-img-cutter2 --save-dev # for vue2 npm install vue-img-cutter3 --save-dev # for vue3vue-img-cutter使用 template模板标签模块&#xff0c…

用Python操作MySQL教程!干货满满!

python操作数据库介绍 Python 标准数据库接口为 Python DB-API&#xff0c;Python DB-API为开发人员提供了数据库应用编程接口。Python 数据库接口支持非常多的数据库&#xff0c;你可以选择适合你项目的数据库&#xff1a; GadFly mSQL MySQL PostgreSQL Microsoft SQL S…

Spring基础以及核心概念(IoC和DIQ)

1.Spring是什么 Spring是包含了众多工具方法的IoC容器 2.loC&#xff08;Inversion of Control &#xff09;是什么 IoC:控制反转,Spring是一个控制反转容器(控制反转对象的生命周期) Spring是一个loC容器&#xff0c;我们之前学过的List/Map就是数据存储的容器&#xff0c;to…

大数据Doris(五):开始编译 Doris

文章目录 开始编译 Doris 一、下载Doris的安装包 二、解压缩 三、上传配置文件