c++ unordered_set

2023-09-21 11:23:01

unordered_set

可直译为“无序 set 容器”,即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。
本质是使用hash散列的方式存储数据,是一种使用hash值作为key的容器,所以当有频繁的搜索、插入和移除拥有常数时间。
unordered_set存储原理是声明一个有n个桶的数据结构,计算加入到unordered_set的新的值hash,然后计算hash%n后的值x,将新的值加入到桶x中。当桶x中已经有了元素,就直接链接在后边。当数据结构中的元素满足一定数量时需要扩充桶的数量,并重新构建桶结构。

特点

  1. unordered_set是一种容器,它以不特定的顺序存储唯一的元素,并允许根据元素的值快速检索单个元素。
  2. 在unordered_set中,元素的值同时是唯一标识它的键。键是不可变的,只可增删,不可修改。
  3. 在内部,unordered_set中的元素没有按照任何特定的顺序排序,而是根据它们的散列值组织成桶(一个线性链表代表一个桶),从而允许通过它们的值直接快速访问单个元素(平均时间复杂度为常数)。
  4. unordered_set容器比set容器更快地通过它们的键访问单个元素,尽管它们在元素子集的范围迭代中通常效率较低。
  5. 容器中的迭代器只能是正向迭代器。

基本使用

初始化

调用 unordered_set 模板类的默认构造函数,可以创建空的 unordered_set 容器

std::unordered_set<std::string> uset;

创建 unordered_set 容器的同时,可以完成初始化操作

std::unordered_set<std::string> c{ "aaa", "bbb", "ccc" }

调用 unordered_set 模板中提供的复制(拷贝)构造函数,将现有 unordered_set 容器中存储的元素全部用于为新建 unordered_set 容器初始化

std::unordered_set<std::string> uset2(uset);

以右值引用的方式,利用临时 unordered_set 容器中存储的所有元素,给新建容器初始化

//返回临时 unordered_set 容器的函数
std::unordered_set <std::string> retuset() {
    std::unordered_set<std::string> tempuset{ "aaa", "bbb", "ccc" };
    return tempuset;
}
//调用移动构造函数,创建 uset 容器
std::unordered_set<std::string> uset(retuset());

使用 unordered_set 类模板提供的迭代器,在现有 unordered_set 容器中选择部分区域内的元素,为新建 unordered_set 容器初始化

//传入 2 个迭代器,
std::unordered_set<std::string> uset2(++uset.begin(),uset.end());

添加元素

c.insert("dddd"):向容器添加元素”dddd"

a.insert({ "aaa","bbbb","cccc" }):向容器添加元素"aaa","bbbb","cccc"

a.insert(b.begin(), b.end()):b是一个存储着和a相同类型元素的向量,可将b中所有元素添加到a中

查找元素

a.find("eeee"):查找元素"eeee",返回结果为a.end()则表明没有找到,否则返回所对应元素

a.count("eeee"):查找元素"eeee"在a中有几个(由于unordered_set中没有相同的元素,所以结果通常为01

查找桶接口

a.bucket_count():返回数据结构中桶的数量

a.bucket_size(i):返回桶i中的大小

a.bucket(“eeee"):返回元素"eeee"在哪个桶里

观察器

a.hash_function()("aaa"):返回"aaa"所对应的hash值;

a.key_eq()("aaa","aaaa") :当元素相同时返回true,否则返回false

清除元素

a.clear():清除a中所有元素;

a.erase("aaa"):清除元素"aaa"

统计函数

a.size():返回a中总的元素个数;

a.max_size():返回a中最大容纳元素;

a.empty():判断a中是否为空

方法列表

成员方法功能
begin()返回指向容器中第一个元素的正向迭代器
end();返回指向容器中最后一个元素之后位置的正向迭代器
cbegin()和 begin() 功能相同,只不过其返回的是 const 类型的正向迭代器
cend()和 end() 功能相同,只不过其返回的是 const 类型的正向迭代器
empty()若容器为空,则返回 true;否则 false
size()返回当前容器中存有元素的个数
max_size()返回容器所能容纳元素的最大个数,不同的操作系统,其返回值亦不相同
find(key)查找以值为 key 的元素,如果找到,则返回一个指向该元素的正向迭代器;反之,则返回一个指向容器中最后一个元素之后位置的迭代器(如果 end() 方法返回的迭代器)
count(key)在容器中查找值为 key 的元素的个数
equal_range(key)返回一个 pair 对象,其包含 2 个迭代器,用于表明当前容器中值为 key 的元素所在的范围
emplace()向容器中添加新元素,效率比 insert() 方法高
emplace_hint()向容器中添加新元素,效率比 insert() 方法高
insert()向容器中添加新元素
erase()删除指定元素
clear()清空容器,即删除容器中存储的所有元素
swap()交换 2 个 unordered_set 容器存储的元素,前提是必须保证这 2 个容器的类型完全相等
bucket_count()返回当前容器底层存储元素时,使用桶(一个线性链表代表一个桶)的数量
max_bucket_count()返回当前系统中,unordered_set 容器底层最多可以使用多少桶
bucket_size(n)返回第 n 个桶中存储元素的数量
bucket(key)返回值为 key 的元素所在桶的编号
load_factor()返回 unordered_set 容器中当前的负载因子。负载因子,指的是的当前容器中存储元素的数量(size())和使用桶数(bucket_count())的比值,即 load_factor() = size() / bucket_count()
max_load_factor()返回或者设置当前 unordered_set 容器的负载因子
rehash(n)将当前容器底层使用桶的数量设置为 n
reserve()将存储桶的数量(也就是 bucket_count() 方法的返回值)设置为至少容纳 count 个元(不超过最大负载因子)所需的数量,并重新整理容器
hash_function()返回当前容器使用的哈希函数对象
更多推荐

利用面向对象方法,处理数据文件【Python】

题目背景:处理两份数据文件(文本数据和JSON数据),用面向对象的方法,效果图用柱状图呈现。本题思路:1.首先,创建一个【基础数据类】,名为Record,它将包含成员属性和成员方法。这个类将作为数据处理的基础结构。2.接着,创建一个【处理数据父类】,名为FileReader,它将包含成员方法,这个成员方法将被子类继承和

【SDXL_LORA模型训练详细教程(含云端教程)】

个人网站:https://tianfeng.space一、前言之前写过一篇SD1.5LORA模型的炼制方法,有的人想要我详细点说说秋叶启动器的lora训练器,SDXL建议使用秋叶的训练器,SD1.5赛博丹炉,个人习惯仅供参考!这次基于sdxl_lora模型的训练,顺便给大家详细的讲讲训练过程。SD1.5_lora训练文

【文件上传-配置文件】crossdomain.xml跨域策略配置文件上传

目录一、0x00前言二、基础知识1、Flash2、crossdomain.xml文件3、crossdomain.xml格式4、crossdomain.xml相关参数三、漏洞利用1、方法:2、上传漏洞配置文件一、0x00前言在很多地方都会见查是否跨域比如某些特定的步骤、CSRF、flash跨域劫持等链接二、基础知识1、F

ChatGPT:怎么用Java调出来文件选择器,然后返回文件的位置和名称?Swing 组件和 AWT 组件:Java GUI 编程的不同之处

ChatGPT:怎么用Java调出来文件选择器,然后返回文件的位置和名称?Swing组件和AWT组件:JavaGUI编程的不同之处怎么用Java调出来文件选择器,然后返回文件的位置和名称ChatGPT:在Java中,你可以使用JFileChooser类来创建一个文件选择器对话框,然后让用户选择文件,并获取所选文件的位置

Intel芯片的Mac电脑需注意,新型恶意软件能窃取系统中的各类密码

据BleepingComputer消息,一种名为“MetaStealer”的新型信息窃取恶意软件可以从基于Intel芯片的macOS系统电脑中窃取各种敏感信息。MetaStealer是一种基于Go语言编写的恶意软件,能够逃避Apple内置防病毒技术,主要目标针对商业用户。网络安全公司SentinelOne在VirusT

【C++】LeetCode 160 相交链表

今天再写一道算法题(这两周都写算法题有点摆烂)题目给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:注意:如果两个链表没有交点,返回null.在返回结果后,两个链表仍须保持原有的结构。可假定整个链表结构中没有循

【Java 基础篇】Java transient 关键字详解:对象序列化与非序列化字段

在Java编程中,我们经常需要将对象序列化为字节流以便于存储或传输,或者将字节流反序列化为对象以恢复其状态。然而,并不是所有对象的所有属性都应该被序列化。有些属性可能包含敏感信息,或者它们只在内存中有意义。在这些情况下,我们可以使用transient关键字来标记属性,告诉Java序列化机制不要将其序列化。本文将深入介绍

【每日一题】2603. 收集树中金币

文章目录Tag题目来源题目解读解题思路方法一:拓扑排序写在最后Tag【拓扑排序】【树】题目来源2603.收集树中金币题目解读有一个有n个节点的无相无根图,节点编号从0到n-1。有一个表示图中节点间连接关系的数组edges,长度为n-1,edges[i]=[ai,bi]表示节点ai和bi之间有一条边。还有一个数组coin

点灯科技实现 “ESP8266-01/01s + 继电器” 远程开关

教程视频ESP-01S继电器插座怎么使用?所需硬件继电器ESP-01S继电器插座WIFI模块esp8266-01swifi模块烧录器软件准备ArduinoIDE需安装好esp8266扩展点击下载下载并安装blinkerAPPAndroid下载:点击下载或在android应用商店搜索“blinker”下载安装IOS下载:

十几款IDEA开发必备的插件,新手必用

IDEA有很多优秀的插件,使用它们不仅大大增加了开发效率,也能给大家带来更好的coding体验。“工欲善其事必先利其器”,以下插件基本都可以通过IDEA自带的插件管理中心安装。1、CodeGlance拖动浏览代码更加方便,还有放大镜功能。2、Restfultoolkit一套RESTful服务开发辅助工具集,完美代替po

车企大军「涌进」零部件赛道,毫米波雷达市场被重估

垂直整合,是新一轮竞争周期的关键词。从芯片、传感器,到域控制器;从三电总成到智能底盘,不管是特斯拉、比亚迪,还是蔚来、零跑、哪吒等后来者,自研+自产+自销,玩法不一。比如,特斯拉率先开启智能驾驶芯片的自研,彻底奠定了在自动驾驶领域的领先地位(不受制于第三方芯片供应商)。从算法(软件甚至功能)出发设计芯片架构,成为车企自

热文推荐