C++之unordered_set和unordered_map

C++之unordered_set和unordered_map

一、unordered系列关联式容器 

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

1.1 unordered_map 

1.2 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. 它的迭代器至少是前向迭代器。

1.3unordered_map的使用

unordered_map成员函数

unordered_map的使用

void test_unordered_map1() { unordered_map<string, string> dict; dict.insert(make_pair("insert", "插入")); dict.insert(make_pair("love", "爱")); dict["sort"] = "排序"; dict["miss"]; dict["miss"] = "想念、错过"; unordered_map<string, string>::iterator it = dict.begin(); while (it != dict.end()) { cout << it->first << ":" << it->second << endl; ++it; } cout << endl; } int main() { test_unordered_map1(); return 0; }

注意:
1、[ ]实际调用哈希桶的插入操作,用参数key与V()构造一个默认值往底层哈希桶
中插入,如果key不在哈希桶中,插入成功,返回V(),插入失败,说明key已经在哈希桶中,
将key对应的value返回。
2、unordered_map中key是不能重复的,因此count函数的返回值最大为1


1.4unordered_set的介绍

1、unordered_set是一种容器,它以任意顺序存储唯一的元素,并允许根据元素的值快速检索单个元素。
2、在unordered_set中,元素的值同时也是其键,用于唯一标识该元素。键是不可变的,因此,unordered_set中的元素一旦存入容器就不能被修改——不过可以插入和移除。
3、在内部,unordered_set中的元素并不按任何特定顺序排序,而是根据它们的哈希值被组织到各个桶中,以便通过元素的值直接快速访问单个元素(平均具有常数级的时间复杂度)。
4、unordered_set在通过键访问单个元素方面比有序集合容器更快,不过在对其部分元素进行范围迭代时,通常效率较低。
5、unordered_set的迭代器至少是前向迭代器。


1.5unordered_set的使用

unordered_set成员函数

unordered_set的使用

void test_unordered_set1() { unordered_set<int> us; us.insert(2); us.insert(3); us.insert(2); us.insert(1); us.insert(0); unordered_set<int>::iterator it = us.begin(); while (it != us.end()) { cout << *it << endl; ++it; } cout << endl; } int main() { test_unordered_set1(); return 0; }

注意:unordered_set只能去重,不能左到排序

1.6map、set、unordered_map、unordered_set性能测试

void test_performance() { const size_t N = 1000000; unordered_set<int> us; set<int> s; vector<int> v; v.reserve(N); srand((size_t)time(0)); for (size_t i = 0; i < N; ++i) { v.push_back(rand() + 1); } 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; }

运行结果:

总结:有大量重复数据的时候unordered_set、unordered_map更占优势,但是有序的数据set、map更占优势。

二、unordered_set和unordered_map的OJ题目

在长度2N的数组里找出重复N次的元素

思路:把其放到unordered_map里面去,然后统计次数,算出n的一半,然后找到那个出现次数为一半的元素

class Solution { public: int repeatedNTimes(vector<int>& nums) { unordered_map<int, int> countmap; for (auto element : nums) { countmap[element]++; } int count = nums.size() / 2; for (auto element : countmap) { if (element.second == count) { return element.first; } } //不可能的情况返回-1 return -1; } };

Read more

JSP 文件上传详解

JSP 文件上传详解 引言 在Web开发中,文件上传是一个常见的功能,它允许用户将文件从客户端发送到服务器。Java Server Pages(JSP)作为一种强大的服务器端技术,也支持文件上传功能。本文将详细讲解JSP文件上传的实现过程,包括技术原理、实现步骤和注意事项。 技术原理 JSP文件上传主要依赖于HTTP协议的multipart/form-data编码类型。这种编码类型允许表单中包含文件类型的输入字段。当用户提交表单时,浏览器会将表单数据以文件的形式发送到服务器。 服务器端使用Java的javax.servlet包中的HttpServletRequest和HttpServletResponse对象来接收这些文件。同时,javax.servlet包中的javax.servlet.http模块提供了Part接口,用于访问上传的文件内容。 实现步骤 以下是使用JSP实现文件上传的基本步骤: 1. 创建HTML表单 首先,我们需要创建一个HTML表单,其中包含一个文件类型的输入字段。以下是一个简单的示例: <form action="upload.jsp"

By Ne0inhk

90% 的 Java 程序员其实没真正理解这些语法:从对象模型到多态机制一次讲透

在多数项目里,代码能跑并不代表设计合理。很多隐藏的 Bug、难以维护的结构甚至线上问题,往往都源于对 Java 基础语法理解不够深入:引用到底是什么?构造方法执行顺序如何?为什么子类对象能赋给父类引用?这些看似“入门级”的知识,如果只停留在表面,很容易在复杂系统中埋下隐患。与其零散记忆语法规则,不如从对象模型与运行机制的角度系统梳理一遍,让这些概念在工程实践中真正落地。 一、类与文件规则:不仅是语法要求,更是工程约束 Java 要求 public 修饰的类必须与文件名一致,且一个源文件中只能有一个 public 类。这种设计保证了类加载与编译过程的可预测性,也让大型项目的模块结构更加清晰。 类体由成员变量与方法组成,用于描述对象的状态与行为。即便类体为空,它仍然是一个合法类型,这体现了 Java 强调“类型即抽象”的设计思想。 二、类与对象:抽象模型与实例的关系 类是对现实事物的抽象,对象则是类的具体实例。Java 的类型体系由基本类型与引用类型构成,其中数组也属于对象类型的一种特殊形式。 与

By Ne0inhk
推荐12款AI免费一键生成PPT的网站【2026年最新】

推荐12款AI免费一键生成PPT的网站【2026年最新】

一、引言 你有没有过这种体验?为了一份 PPT 熬到深夜,字体、配色反复调整......结果成品还是显粗糙。如今 AI 早已融入各行各业,利用其快速做高质量 PPT,已成职场人、学生和教师的刚需。 但市面上 AI PPT 工具太多,有的求快、有的重设计,收费也乱,该怎么选才不踩坑? 经过对12大主流的AI生成PPT工具的深度对比,从大纲生成、模板内容到付费模式都一一做了详细的对比。不管你是赶工作周报、准备路演 PPT,还是做教学课件、毕业答辩稿,都能在这找到适配的选择。 二、PPT一键生成工具 1. 博思PPT 博思AIPPT是新一代AI智能PPT生成平台,通过深度学习技术实现从内容生成到视觉设计的全流程自动化。 传送入口:https://ai-to.cn/url?u=pptgo 推荐指数:⭐⭐⭐⭐ 示例:个人成就与挑战之年度回顾。 内容框架很贴合年度总结的需求,

By Ne0inhk
告别命令行“黑箱“!Open Claude Cowork:让AI代理可视化协作的革命性桌面应用

告别命令行“黑箱“!Open Claude Cowork:让AI代理可视化协作的革命性桌面应用

🔥 博主正在参加2025博客之星活动,您的每一票都是对技术分享的最大鼓励! 👉 点击为博主投票https://www.ZEEKLOG.net/blogstar2025/detail/070 感谢您的支持!让我们一起推动技术社区的发展! 引言:当Claude Code遇上"可视化"的灵魂拷问 相信每一位用过Claude Code的开发者都有过这样的体验: 你在终端里输入一条指令,然后……等待。屏幕上哗哗地刷着密密麻麻的文字,你瞪大眼睛试图跟上AI的思维,却发现自己仿佛在看一场没有字幕的外语电影。任务完成了吗?它现在在干什么?为什么突然停了?这些问题像三连击一样敲打着你的脑门。 Claude Code确实强大——它能写代码、管文件、跑命令,堪称程序员的"瑞士军刀"。但说真的,谁规定强大的工具就一定要长成"黑漆漆的终端"的样子呢? 今天要给大家介绍的Open Claude Cowork,就是这样一款"

By Ne0inhk