unordered_map 与 unordered_set 的使用

unordered_map

unordered_map 的介绍文档

unordered_map 的介绍文档:来自cpluscplus.com 的中文翻译

  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 是 C++11 的语法,C++98 是没有 unordered_map

构造函数

unordered_map 存储的数据是:key-value 的结构,因此实例化 unordered_map 需要传入两个模板参数。unordered-map 的底层数据结构是哈希表。unordered_map 数据 key-value 形式的存储你可以理解为哈希表存储了一个 pair 。传入的第一个模板参数就是 pair 的 first,传入的第二个模板参数就是 pair 的 second。

  • unordered_map 可以无参构造,这是在做算法题用的比较多的。
  • unordered_map 可以使用 initializer_list 来初始化。initializer_list 是 C++11 的语法。
#include<iostream>
#include<unordered_map>
using namespace std;

int main()
{
    unordered_map<int, int> hash1; //这是无参构造
    unordered_map<int, int> hash2({{1,1}, {2,2}, {3,3}}); //这是使用initializer_list来构造
    return 0;
}

bool empty() const

这个函数用来判断哈希表是否为空,为空返回 true;否则返回 false。

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

int main()
{
    unordered_map<int, int> hash1; //这是无参构造
    unordered_map<int, int> hash2({{1,1}, {2,2}, {3,3}}); //这是使用initializer_list来构造

    cout << hash1.empty() << endl; //输出:1

    cout << hash2.empty() << endl; //输出:0
    return 0;
}

size_t size() const

这个函数用来获取哈希表中有效元素的个数。

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

int main()
{
    unordered_map<int, int> hash1; //这是无参构造
    unordered_map<int, int> hash2({{1,1}, {2,2}, {3,3}}); //这是使用initializer_list来构造

    cout << hash1.size() << endl; //输出:1

    cout << hash2.size() << endl; //输出:3
    return 0;
}

迭代器

  • begin:返回哈希表中第一个元素的位置对应的迭代器。
  • end:返回的迭代器并不指向任何元素,而是指向容器中最后一个元素之后的位置。因此,返回的值不应被取消引用。
    有了 begin 和 end 迭代器,我们就可以遍历 unordered_map 了。
#include<iostream>
#include<unordered_map>
using namespace std;

int main()
{
    unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造
    auto it = hash2.begin();
    while(it != hash2.end())
    {
        cout << it->first << " " << it->second << endl;
        ++it;
    }
    return 0;
}

在这里插入图片描述
我们看到最后遍历得到的结果与插入的顺序并不相同。这也证明了 unordered_map 是一个无序容器。仅仅存储一个 key-value 的数据。

const V& operator[](const K& key)

这个函数和 mapoperator[] 很像。
如果 key 与容器中某个元素的键相匹配,函数会返回其映射值(value)的引用。

如果 key 与容器中任何元素的键不匹配,函数将插入一个具有该键的新元素,并返回其映射值的引用。请注意,即使没有为元素分配映射值(元素是使用默认构造函数构造的),容器的大小也会增加一个。

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

int main()
{
    unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造

    cout << hash2[10] << endl; //输出:10

    hash2[40]; // 使用 operator[] 访问key为 40 的元素,但是不存在,会插入一个 key 为 40 的元素,value我们没有指定,那么会调用 value 类型的默认构造函数:int() 作为 40 这个 key 值的 value 值

    cout << hash2[40] << endl; //输出:0
    return 0;
}

iterator find(const K& key)

unordered_map 中查找 key,如果查找成功返回该位置对应的迭代器,如果查找失败,那么返回 unordered_map::end ,就是 end 迭代器。
下面的代码中,我们使用 find 查找一个元素,通过得到的迭代器访问他的 value。

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

int main()
{
    unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造
	
	auto it = hash2.find(10);
    if(it == hash2.end()) cout << "此元素不存在" << endl;
    else cout << it->second << endl; //输出:10

    return 0;
}

size_t count(const K& key) const

搜索容器中键为 key 的元素,并返回找到的元素个数。由于 unordered_map 容器不允许键重复,这意味着如果容器中存在键为 key 的元素,函数实际返回 1,否则返回 0。

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

int main()
{
    unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造

    cout << hash2.count(10) << endl; //输出:1
    cout << hash2.count(40) << endl; //输出:0

    return 0;
}

pair<iterator, bool> insert ( const pair<K, V>& kv )

这个函数和 mapinsert 完全一样。
你可以向 unordered_map 中插入一个键值对。
函数返回一个 pair 对象,其第一个元素是一个迭代器,指向容器中新插入的元素或键等价的元素,另一个 bool 值表示该元素是否插入成功。

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

int main()
{
    unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造

    pair<unordered_map<int, int>::iterator, bool> ret1 = hash2.insert(make_pair(40, 40));
    cout << "插入成功与否:" << ret1.second << endl; //插入成功,ret1.second 为 1

    pair<unordered_map<int, int>::iterator, bool> ret2 = hash2.insert(make_pair(30, 0));
    cout << ret2.first->second << endl; //插入失败,得到的是原 key 为 30 的元素对应的 value:30 而不是新插入的 0

    return 0;
}

insert 函数也可以插入 initializer_list 和构造函数那里一样:
hash2.insert({60,60})

erase 函数

erase 有三个重载的版本:
在这里插入图片描述

  • 第一个版本:删除一个迭代器位置的元素。
  • 第二个版本:删除键为 k 的元素。
  • 第三个版本:删除一个迭代器区间。
#include<iostream>
#include<unordered_map>
using namespace std;

int main()
{
    unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造

    hash2.erase(hash2.begin()); //第一个版本

    hash2.erase(30); //第二个版本

    hash2.erase(hash2.begin(), hash2.end()); //第三个版本

    return 0;
}

void clear() const

清空 unordered_map 中所有的元素。

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

int main()
{
    unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //这是使用initializer_list来构造

    hash2.clear();

    cout << hash2.size() << endl; // 输出:0

    return 0;
}

unordered_set

这是 unordered_set 的介绍文档:来自 cpluscplus.com。

  • unordered_set 是一种不按特定顺序存储唯一元素的容器,可以根据元素的值快速检索单个元素。

  • 在 unordered_set 中,元素的值同时也是其键,可以唯一地识别该元素。键是不可变的,因此,unordered_set 中的元素一旦进入容器就不能修改,但可以插入和移除。

  • 在内部,unordered_set 中的元素不按任何特定顺序排序,而是根据它们的哈希值组织成桶,以便直接按其值快速访问单个元素(平均时间复杂度不变)。

  • 无序集容器在按键访问单个元素时比集合容器更快,但在对元素子集进行范围迭代时,其效率通常较低。

  • 容器中的迭代器至少是前向迭代器。

unordere_set 存储的数据只有一个 key。
unordered_set 与 unordered_map 的接口完全相同。这里就不再赘述了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国内企业出海首选的免费开源订单管理系统(OMS)解决方案

用开源智造Odoo订单管理系统 (OMS) 解决方案实现"订单到收款"流程自动化 开源智造Odoo 订单管理软件功能消除了手动操作瓶颈&#xff0c;可防止出错&#xff0c;还建立了从销售报价到订单履行的顺畅工作流来确保及时开票和付款&#xff0c;从而帮助您理顺订单处理过程…

大数据量条件SQL查询内存处理方案以及数据过滤算法优化

MySQL是一个广泛使用的关系型数据库管理系统。通过SQL语言进行数据操作和查询&#xff0c;还支持多用户、多线程和分布式操作等功能。 在实际使用中&#xff0c;我们会遇到各种查询条件&#xff0c;如字段名、表名、逻辑运算符、比较运算符、函数等。其中&#xff0c;有些查询…

【SpringCloud】从单体架构到微服务架构

今天来看看架构的演变过程 一、单体架构 从图中可以看到&#xff0c;所有服务耦合在一起&#xff0c;数据库存在单点&#xff0c;一旦其中一个服务出现问题时&#xff0c;整个工程都需要重新发布&#xff0c;从而导致整个业务不能提供响应 这种架构对于小项目而言是没有什么…

人人吐槽互联网行情不好?但这个岗位的需求猛增、疯狂招人!

在目前的大环境下&#xff0c;外部力量对国内国高科技领域的打压和封锁&#xff0c;国内的IT大厂纷纷进行了裁员&#xff0c;IT行业的龙头大厂裁员举措引发行业震动…… 可真的是这样吗&#xff1f;中国IT没前途了?在IT行业找不到工作了&#xff1f;非也非也&#xff0c;这只…

IoU计算方式

文章目录 一.IoU的简介及原理解析二.yolov系列中的IOU 一.IoU的简介及原理解析 IoU的全称为交并比&#xff08;Intersection over Union&#xff09;&#xff0c;通过这个名称我们大概可以猜到IoU的计算方法。IoU计算的是 “预测的边框”和“真实的边框”的交集和并集的比值。…

2023年“福建省工业互联网+智能制造创新大赛”开启报名

11月22日&#xff0c;由福建省总工会、福建省大数据集团有限公司共同举办的2023年“福建省工业互联网智能制造创新大赛”启动报名。 大赛积极响应《福建省总工会等八部门关于广泛深入开展劳动和技能竞赛为新发展阶段新福建建设建工立业的意见》&#xff08;闽工〔2022〕70号&am…

新手小白想做跨境电商,应该选第三方平台还是独立站?

近几年在疫情的影响下&#xff0c;电商特有的“免接触”模式迅速切中消费者的心理痛点&#xff0c;加上国内电商发展已经趋于平缓&#xff0c;很多线下店铺被迫关闭&#xff0c;这也使得越来越多的大卖和平台也不约而同布局跨境电商。而说到跨境电商&#xff0c;或许大家普遍想…

线程的认识

线程的引入 上一篇中,我们主要讲到了进程,多任务操作系统,希望系统能同时运行多个程序.如果是单任务的操作系统,完全不涉及进程,也不需要管理,更不需要调度.因此,本质上来说,进程是用来解决"并发编程"这样的问题的.但在一些特定的情况下,进程的表现,往往不尽如人意.比…

VTK物体表面画贴合线条

1、自由画线 2、曲线拟合画线 3、三点闭合曲线

软件流程设计之事件风暴EventStorming

最近新开了一个公众号&#xff0c;有兴趣可以关注一下。时不时就复活去更新一下。 最近在带几个新员工&#xff0c;新员工是学校刚毕业的&#xff0c;习惯于做一些导师或者师兄师姐们拆解好的任务&#xff0c;有很明确的功能描述&#xff0c;甚至喂饭喂到什么地步呢&#xff0…

跨境电商的微商业务:个人品牌的成功之路

随着互联网的发展&#xff0c;跨境电商行业迅猛崛起&#xff0c;微商业务作为其中的一种新型销售模式也逐渐崭露头角。微商业务以低成本、高灵活性的特点&#xff0c;为个人品牌的成功之路开辟了新的可能性。 本文将深入研究跨境电商微商业务&#xff0c;探讨在这个领域中个人…

竞赛YOLOv7 目标检测网络解读

文章目录 0 前言1 yolov7的整体结构2 关键点 - backbone关键点 - head3 训练4 使用效果5 最后 0 前言 世界变化太快&#xff0c;YOLOv6还没用熟YOLOv7就来了&#xff0c;如果有同学的毕设项目想用上最新的技术&#xff0c;不妨看看学长的这篇文章&#xff0c;学长带大家简单的…

GitHub上8个强烈推荐的 Python 项目

文章目录 前言1. Manim2. DeepFaceLab3. Airflow4. GPT-25. XSStrike6. 谷歌图片下载7. Gensim8. SocialMapper总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③…

Vue3-provide和inject

作用和场景&#xff1a;顶层组件向任意的底层组件传递数据和方法&#xff0c;实现跨层组件通信 跨层传递普通数据&#xff1a; 1.顶层组件通过provide函数提供数据 2.底层组件通过inject函数获取数据 既可以传递普通数据&#xff0c;也可以使用ref传递响应式数据&#xff08…

WorkPlus即时通讯,打通上下游产业链,构建企业生态圈

如今&#xff0c;随着信息技术的迅速发展&#xff0c;智慧水务、智慧医疗、智慧城市、智慧教育、智慧政务等领域正蓬勃发展。在这个智慧时代&#xff0c;企业需要一个具备开放性和扩展性的平台级产品&#xff0c;以满足多样化的业务需求。WorkPlus作为一款全新的移动底座产品&a…

Linux应用开发基础知识——I2C应用编程(十二)

前言&#xff1a; I2C&#xff08;Inter-Integrated Circuit BUS&#xff09;是集成电路总线&#xff0c;是目前应用最广泛的总线之一&#xff0c;最初由PHILIPS&#xff08;现为NXP&#xff09;设计。它使用多主从架构&#xff0c;主要用于连接低速周边设备。I2C总线在硬件物理…

高效聚合 | AIRIOT智慧虚拟电厂管理解决方案

传统的电力供应模式主要依靠大型发电厂和电网进行能源传输和分配&#xff0c;但这种模式会导致能源浪费、环境污染等问题&#xff0c;往往存在如下的运维问题和管理痛点&#xff1a; 资源整合能力差&#xff1a;传统电力供应模式无法集成和整合分散的电力资源&#xff0c;包括…

将所有图片居中对齐

Ctrl h 调出替换框 ^g表示所有图片 格式里面选择段落 全部替换

国自然项目基金撰写的隐藏技巧、范例分析及提交前的自我审查

目录 一、基金项目申请要求、重点及项目介绍 二、基金的撰写技巧 三、基金撰写的隐藏技巧 四、范例分析及提交前的自我审查 更多应用 基金项目申请需要进行跨学科的技术融合&#xff0c;申请人需要与不同领域结合&#xff0c;形成多学科交叉的研究。基金项目申请在新时期更…

JS逆向之wasm逆向(二)

本文仅供技术交流和技术学习 不做其他用途 接着上一篇继续讲&#xff1a; 上篇地址&#xff1a; JS逆向之wasm逆向(二进制) 网址&#xff1a; aHR0cHM6Ly93d3cuN3E2Y3lqLmNvbTo5MDAxL3JlZ2lzdGVyNDY5Njg/aV9jb2RlPTQ0Mjc5OTU1 这个网站我们后面可以继续讲他的debugger 和滑块…