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; //输出:1cout << hash2.empty() << endl; //输出:0return 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; //输出:1cout << hash2.size() << endl; //输出:3return 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; //输出:10hash2[40]; // 使用 operator[] 访问key为 40 的元素,但是不存在,会插入一个 key 为 40 的元素,value我们没有指定,那么会调用 value 类型的默认构造函数:int() 作为 40 这个 key 值的 value 值cout << hash2[40] << endl; //输出:0return 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; //输出:10return 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; //输出:1cout << hash2.count(40) << endl; //输出:0return 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 为 1pair<unordered_map<int, int>::iterator, bool> ret2 = hash2.insert(make_pair(30, 0));cout << ret2.first->second << endl; //插入失败,得到的是原 key 为 30 的元素对应的 value:30 而不是新插入的 0return 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; // 输出:0return 0;
}

unordered_set

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenWRT软路由web界面如何远程访问

文章目录 1.openWRT安装cpolar2.配置远程访问地址3.固定公网地址 简单几步实现在公网环境下远程访问openWRT web 管理界面&#xff0c;使用cpolar内网穿透创建安全隧道映射openWRT web 界面面板443端口&#xff0c;无需公网IP&#xff0c;无需设置路由器。 1.openWRT安装cpola…

解决:前端js下载文件流出现“未知文件格式”错误

第一中情况&#xff1a; 出现的问题&#xff0c;前端已经设置了responseType: blob,下载下来还是格式不对。 最后经过排查&#xff0c;后端缺少charsetutf-8&#xff0c;所以前端可以设置编码&#xff1a; 第二中情况&#xff1a; 后端已经设置了charsetutf-8&#xff0c;前…

【Java】认识String类

文章目录 一、String类的重要性二、String类中的常用方法1.字符串构造2.String对象的比较3.字符串查找4.转换5.字符串替换6.字符串拆分7.字符串截取8.其他操作方法9.字符串的不可变性10.字符串修改 三、StringBuilder和StringBuffer 一、String类的重要性 在C语言中已经涉及到…

leetcode (力扣) 97. 交错字符串(动态规划)

文章目录 题目描述思路分析完整代码 题目描述 给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串&#xff1a; s s1 s2 … sn t …

tp8 使用rabbitMQ(1)简单队列

php8.0 使用 rabbitmq 要使用 3.6版本以上的&#xff0c; 并且还要开启 php.ini中的 socket 扩展 php think make:command SimpleMQProduce //创建一个生产者命令行 php think make:command SimpleMQConsumer //创建一个消费者命令行 代码中的消息持久化的说明 RabbitMQ 消息持…

登陆页面模板

简单好看的登陆页面 vue项目代码 可忽略js部分 先来个效果图 <template><div class"login"><div class"content"><p >账户密码登录</p><div class"unit"><label class"label">用户名</…

Linux-权限

1.Shell命令以及运行原理 Linux 严格意义上说的是一个操作系统&#xff0c;我们称之为 “ 核心&#xff08; kernel &#xff09; “ &#xff0c;但我们一般用户&#xff0c;不能直接使用 kernel 。而是通过kernel 的 “ 外壳 ” 程序&#xff0c;也就是所谓的 shell &#x…

DLL劫持漏洞

以下是自己学习时做的一些笔记&#xff0c;希望对各位有所帮助 DLL劫持漏洞 为什么程序中会有dll的存在 对于 Windows 操作系统&#xff0c;操作系统的大部分功能都由 DLL 提供。 另外&#xff0c;当您在这些 Windows 操作系统之一上运行某一程序时&#xff0c;该程序的很多…

Python语言:猜数字游戏案例讲解

猜数字游戏题目要求如下&#xff1a;该程序随机生成一个1到100之间的整数&#xff0c;然后要求玩家在有限的次数内猜出这个数字。如果玩家猜对了&#xff0c;游戏结束并显示成功信息&#xff1b;如果玩家猜错了&#xff0c;程序会提示玩家猜的数字是偏大还是偏小&#xff0c;并…

最新版灵沐V3.3微信资源类小程序源码支持流量主

源码简介 最新版灵沐V3.3微信资源类小程序源码支持流量主&#xff0c;一套不错的流量主变现资源下载小程序&#xff0c;它支持在微信、QQ和抖音平台上运行。这次更新主要集中在全局UI设计的升级&#xff0c;并依然注重资源下载和激励视频变现的功能。另外&#xff0c;还新增了…

如何利用Python进行数据归一化?

1. 知识简介 数据归一化是数据预处理的一项重要步骤&#xff0c;它对于提高模型性能、加速模型训练、避免数值计算问题以及提高模型的泛化能力都具有重要作用。进行数据归一化可以起到以下作用&#xff1a;消除量纲影响&#xff0c;加速模型收敛&#xff0c;提高模型性能&…

每日汇评:黄金测试2000美元水平遭到拒绝,为下跌留下了空间

黄金在心理关键的2000美元水平失去了上升动力&#xff1b; 美元指数上涨持续&#xff0c;同时国债收益率反弹&#xff0c;都对黄金价格的上涨构成压力&#xff1b; 美国即将迎来感恩节假期&#xff0c;意味着明天和周五流动性较低&#xff1b; 黄金价格继续在每盎司2000美元以上…