热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

unordered_set和unordered_map的基本使用及常用接口

本文介绍了unordered_set和unordered_map的基本使用方法和常用接口。unordered_set是一种无序的容器,允许通过键值快速索引到对应的元素。unordered_map是存储键值对的关联式容器,通过键快速索引到对应的值。文章详细介绍了它们的定义方式、常用接口以及插入、删除、查找元素的方法,并给出了示例代码。同时还介绍了unordered_multiset和unordered_multimap的使用方法,它们允许键值冗余。

unordered_set和unordered_map的基本使用

  • unordered_set
    • unordered_set的使用
      • unordered_set的定义方式
      • unordered_set的常用接口
  • unordered_multiset
  • unordered_map
    • unordered_map的定义方式
    • unordered_map的主要接口使用
  • unordered_multimap

🔒快速导航关联在一起的文章🔒

文章名称链接
二叉搜索树点击直达文章
set和map的基本使用点击直达文章
AVL树点击直达文章
红黑树点击直达文章

💡C++标准库超链接💡

unordered_set

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

unordered_set的介绍:

  • unordered_set不是按特定顺序存储键值的容器,其允许通过键值快速的索引到与其对应的元素。
  • unordered_set在内部,中的元素不是按任何特定顺序排序的,为了实现在常数范围内找到key,unorder_set把相同的哈希值放在哈希桶中。
  • unordered_set元素的值同时也是唯一表示它们的key.
  • unordered_set 容器比 set 容器更快地通过它们的键访问单个元素,尽管它们通常对于通过其元素的子集进行范围迭代的效率较低。
  • 容器中的迭代器至少是前向迭代器。

unordered_set的使用


unordered_set的定义方式

常用的2种方式,库里还有几种,感兴趣的可以看看,链接在上面。

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

unordered_set<int> uns1;//构造1个空的int容器

方式二&#xff1a;拷贝构造同类型的容器

unordered_set<int> uns2(uns1);//拷贝构造同类型的容器

unordered_set的常用接口

它的接口的使用跟set的接口使用是一样的。常用的接口如下&#xff1a;

成员函数功能
insert插入元素
erase删除元素
find查找指定元素
size获取容器中元素的个数
empty判断容器是否为空
clear清除数据
swap交换2个容器的数据
count获取容器中的有效元素的个数

unordered_set的迭代器

begin返回第一个元素的迭代器
end返回最后一个元素下一个位置的迭代器
cbegin返回第一个元素的const迭代器
cend返回最后一个元素下一个位置的const迭代器

示例如下&#xff1a;

void Test_unordered_set1()
{unordered_set<int> uns1;//构造1个空的int容器//插入uns1.insert(2);uns1.insert(10);uns1.insert(4);uns1.insert(13);uns1.insert(2);uns1.insert(12);//迭代器遍历unordered_set<int>::iterator it &#61; uns1.begin();while (it !&#61; uns1.end()){cout << *it << " ";&#43;&#43;it;}cout << endl;//范围for遍历for (auto e : uns1){cout << e << " ";}cout << endl;//删除元素方式1uns1.erase(2);//删除元素方式2unordered_set<int>::iterator pos &#61; uns1.find(10);if(pos !&#61; uns1.end()){uns1.erase(pos);}for (auto e : uns1){cout << e << " ";}cout << endl;
}

其他的接口就不在这里使用了&#xff0c;效果如下&#xff1a;
在这里插入图片描述
✨✨✨✨✨✨✨✨✨✨✨我是分割线✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

unordered_multiset

unordered_multiset和unordered_set的底层都是一样的&#xff0c;都是哈希表。它们接口的使用基本是一致的。区别就是unordered_multiset允许键值冗余。

示例如下&#xff1a;

void Test_unordered_multiset1()
{unordered_multiset<int> unm1;unm1.insert(2);unm1.insert(10);unm1.insert(13);unm1.insert(2);unm1.insert(10);unm1.insert(56);unm1.insert(2);//unordered_multiset::iterator it &#61; unm1.begin();auto it &#61; unm1.begin();//使用auto比较方便while (it!&#61;unm1.end()){cout << *it << " ";&#43;&#43;it;}cout << endl;//范围for遍历更方便for (const auto& e : unm1){cout << e << " ";}cout << endl;
}

unordered_map

unordered_map的简单介绍&#xff1a;

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

unordered_map的定义方式

**方式一&#xff1a;**构造指定key和value的类型的容器

unordered_map<string, string> unm;//指定key和value的类型构造空容器

**方式二&#xff1a;**拷贝构造

unordered_map<string, string> unm1(unm);//拷贝构造

unordered_map的主要接口使用


成员函数功能
insert插入键值对
erase删除指定key值的键值对
find查找指定的key值的键值对
size获得容器中元素的个数
clear清空容器
swap交换2个容器的数据
count获取指定的key值的元素个数

operator[]

1.当前容器中已经有了key值的键值对&#xff0c;返回该键值对value的引用
2.当前容器中没有key值的键值对&#xff0c;先插入,然后在返回键值对中value的引用

unordered_map的迭代器


函数功能
begin返回第一个元素的迭代器
end返回最后一个元素下一个位置的迭代器
cbegin返回第一个元素的const迭代器
cend返回最后一个元素下一个位置的const迭代器

示例如下&#xff1a;

void Test_unordered_map1()
{unordered_map<string,string> unm;unm.insert(make_pair("left", "左边"));unm.insert(make_pair("sort", "排序"));unm.insert(make_pair("right", "右边"));unm.insert(make_pair("left", "左边"));unm.insert(make_pair("big", "大的"));//[]进行插入,常用unm["small"] &#61; "小的";//迭代器遍历unordered_map<string, string>::iterator it &#61; unm.begin();while (it !&#61; unm.end()){cout << it->first << ":" << it->second << " ";&#43;&#43;it;}cout << endl;//范围for遍历更方便for (const auto& e : unm){cout << e.first << ":" << e.second << " ";}cout << endl;unm.erase("left");//unordered_map::iterator pos &#61; unm.find("sort");//删除方式1auto pos &#61; unm.find("sort");if (pos !&#61; unm.end()){unm.erase(pos);}//删除方式2for (const auto& e : unm){cout << e.first << ":" << e.second << " ";}cout << endl;
}

效果如下&#xff1a;
在这里插入图片描述
其他的一些接口就不使用了。

unordered_multimap

跟上面的是一样的&#xff0c;unordered_multimap允许键值冗余。
示例如下&#xff1a;

void Test_unordered_multimap1()
{unordered_multimap<int, string> unmutmap;unmutmap.insert(make_pair(1, "one"));unmutmap.insert(make_pair(10, "ten"));unmutmap.insert(make_pair(2, "two"));unmutmap.insert(make_pair(5, "five"));unmutmap.insert(make_pair(10, "ten"));unmutmap.insert(make_pair(10, "ten"));//范围forfor (const auto& e : unmutmap){cout << e.first << ":" << e.second << " ";}cout << endl;//迭代器遍历unordered_multimap<int, string>::iterator it &#61; unmutmap.begin();while (it!&#61; unmutmap.end()){cout << it->first << ":" << it->second << " ";&#43;&#43;it;}cout << endl;
}

unordered_multimap允许键值对存在冗余&#xff0c;调用[]时&#xff0c;返回键值为key的value的引用存在歧义&#xff0c;所以没有实现[]。本篇文章到这就结束了。


推荐阅读
  • Java 模式原型在游戏服务器架构中的应用与优化 ... [详细]
  • MySQL索引详解及其优化策略
    本文详细解析了MySQL索引的概念、数据结构及管理方法,并探讨了如何正确使用索引以提升查询性能。文章还深入讲解了联合索引与覆盖索引的应用场景,以及它们在优化数据库性能中的重要作用。此外,通过实例分析,进一步阐述了索引在高读写比系统中的必要性和优势。 ... [详细]
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
  • Java集合框架特性详解与开发实践笔记
    Java集合框架特性详解与开发实践笔记 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 针对NOJ1102黑白图像问题,本文采用深度优先搜索算法进行详细分析与实现。该问题要求在给定的时间限制(普通Java为1000-3000毫秒)和内存限制(65536KByte)内,处理一个n×n的黑白图像。通过对图像的逐像素遍历,利用深度优先搜索算法有效地识别并标记相连的黑色区域,从而实现图像的高效处理。实验结果显示,该方法在多种测试用例中均能稳定达到预期效果,具有较高的准确性和效率。 ... [详细]
  • 在 Windows 10 环境中,通过配置 Visual Studio Code (VSCode) 实现基于 Windows Subsystem for Linux (WSL) 的 C++ 开发,并启用智能代码提示功能。具体步骤包括安装 VSCode 及其相关插件,如 CCIntelliSense、TabNine 和 BracketPairColorizer,确保在 WSL 中顺利进行开发工作。此外,还详细介绍了如何在 Windows 10 中启用和配置 WSL,以实现无缝的跨平台开发体验。 ... [详细]
  • 在2021-2022 ACM集训队月度编程挑战赛第二轮中,题目“最大值与最小值的选择”要求参赛者处理一个包含n个元素的数组,并给定一个整数k。任务是通过选择特定的子数组,计算并返回这些子数组的最大值和最小值之间的差值。该问题考验了选手对数组操作和优化算法的理解与应用能力。 ... [详细]
  • 题目:图像处理(HDU1828,计算周长并集,利用线段树与离散化技术进行扫描) ... [详细]
  • 本文详细探讨了OpenCV中人脸检测算法的实现原理与代码结构。通过分析核心函数和关键步骤,揭示了OpenCV如何高效地进行人脸检测。文章不仅提供了代码示例,还深入解释了算法背后的数学模型和优化技巧,为开发者提供了全面的理解和实用的参考。 ... [详细]
  • 在基于.NET框架的分层架构实践中,为了实现各层之间的松散耦合,本文详细探讨了依赖注入(DI)和控制反转(IoC)容器的设计与实现。通过合理的依赖管理和对象创建,确保了各层之间的单向调用关系,从而提高了系统的可维护性和扩展性。此外,文章还介绍了几种常见的IoC容器实现方式及其应用场景,为开发者提供了实用的参考。 ... [详细]
  • 在第二课中,我们将深入探讨Scala的面向对象编程核心概念及其在Spark源码中的应用。首先,通过详细的实战案例,全面解析Scala中的类和对象。作为一门纯面向对象的语言,Scala的类设计和对象使用是理解其面向对象特性的关键。此外,我们还将介绍如何通过阅读Spark源码来进一步巩固对这些概念的理解。这不仅有助于提升编程技能,还能为后续的高级应用开发打下坚实的基础。 ... [详细]
  • Eclipse JFace Text框架中IDocument接口的getNumberOfLines方法详解与编程实例 ... [详细]
  • 大家好,我是梅巴哥er。本文将深入探讨Redux框架中的第三个实战案例,具体实现每两秒自动点击按钮以触发颜色变化的功能。该案例中,一个关键点在于是否需要使用异步操作来处理定时任务,我们将详细分析其必要性和实现方式。通过这一实例,读者可以更好地理解Redux在实际项目中的应用及其异步处理机制。 ... [详细]
author-avatar
乔父系_377
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有