unordered_map和unordered的介绍和使用

目录

unordered系列关联式容器

unordered_map

unordered_map的接口说明

unordered_map的定义方式

unordered_map接口的使用

unordered_map的容量

unordered_map的迭代器

unordered_map的元素访问

unordered_map的查询

unordered_map的修改操作

unordered_multimap

unordered_set

unordered_set的定义方式

unordered_set的接口使用

unordered_multiset


unordered系列关联式容器

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

unordered_map

1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。

2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此 键关联。键和映射值的类型可能不同。

3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。

4. unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭 代方面效率较低。

5. unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问 value。

6. 它的迭代器至少是前向迭代器。

unordered_map的接口说明

unordered_map的构造

unordered_map的定义方式

方式一: 指定key和value的类型构造一个空容器。

unordered_map<int, double> um1; //构造一个key为int类型,value为double类型的空容器

方式二: 拷贝构造某同类型容器的复制品。

unordered_map<int, double> um2(um1); //拷贝构造同类型容器um1的复制品

方式三: 使用迭代器拷贝构造某一段内容。

//使用迭代器区间构造
string str = "nxbw";
unordered_map<int, double> mp3(str.begin(), str.end());

unordered_map接口的使用

unordered_map的容量

bool empty() const  检测unordered_map是否为空

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
cout << mp1.empty() << endl; // 0unordered_map<int, string> mp2;
cout << mp2.empty() << endl; // 1 

size_t size() const  获取unordered_map的有效元素个数

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
mp1.emplace(2, "111");
mp1.emplace(3, "111");cout << mp1.size() << endl; // 3

unordered_map的迭代器

begin 返回unordered_map第一个元素的迭代器

unordered_map<int, string> mp1;unordered_map<int, string>::iterator it = mp1.begin();mp1.emplace(1, "111");
mp1.emplace(2, "111");
mp1.emplace(3, "111");cout << it->first << ' ' << it->second << endl; // 1 111

end 返回unordered_map最后一个元素下一个位置的迭代器

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
mp1.emplace(2, "111");
mp1.emplace(3, "222");unordered_map<int, string>::iterator it = mp1.end();
--it;
cout << it->first << ' ' << it->second << endl;

cbegin 返回unordered_map第一个元素的const迭代器

cend 返回unordered_map最后一个元素下一个位置的const迭代器

unordered_map的元素访问

operator[] 返回与key对应的value,没有一个默认值

注意:该函数中实际调用哈希桶的插入操作,用参数key与V()构造一个默认值往底层哈希桶 中插入,如果key不在哈希桶中,插入成功,返回V(),插入失败,说明key已经在哈希桶中, 将key对应的value返回。

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
mp1.emplace(2, "111");
mp1.emplace(3, "222");cout << mp1[1] << endl; // 111
mp1[1] = "333";
cout << mp1[1] << endl; // 333mp1[4] = "888";
cout << mp1[4] << endl; //插入4,并返回888

unordered_map的查询

iterator find(const K& key) 返回key在哈希桶中的位置

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
mp1.emplace(2, "222");
mp1.emplace(3, "333");//找到返回该位置的迭代器,否则返回end()迭代器
unordered_map<int, string>::iterator it = mp1.find(1);
cout << it->first << it->second << endl;if (mp1.find(4) == mp1.end()) cout << "find fail!" << endl;

size_t count(const K& key) 返回哈希桶中关键码为key的键值对的个数

unordered_map<int, string> mp1;
mp1.emplace(1, "111");
mp1.emplace(2, "222");
mp1.emplace(3, "333");
mp1.emplace(4, "333");
mp1.emplace(5, "333");cout << mp1.count(2) << endl; //找到返回1,否则返回0

unordered_map的修改操作

insert 向容器中插入键值对

unordered_map<int, string> mp1;
mp1.insert(make_pair(1, "111"));
mp1.insert(make_pair(2, "111"));
mp1.insert(make_pair(3, "111"));for (const auto& e : mp1)
{cout << e.first << ' ' << e.second << endl;
}

erase 删除容器中的键值对

mp1.erase(1);
mp1.erase(2);for (const auto& e : mp1)
{cout << e.first << ' ' << e.second << endl;
}

void clear() 清空容器中有效元素个数

unordered_map<int, string> mp1;
mp1.insert(make_pair(1, "111"));
mp1.insert(make_pair(2, "111"));
mp1.insert(make_pair(3, "111"));mp1.clear();
cout << mp1.empty() << endl; // 1

void swap(unordered_map&) 交换两个容器中的元素

unordered_map<int, string> mp1;
mp1.insert(make_pair(1, "111"));
mp1.insert(make_pair(2, "222"));
mp1.insert(make_pair(3, "333"));unordered_map<int, string> mp2;
mp2.insert(make_pair(4, "444"));
mp2.insert(make_pair(5, "555"));
mp2.insert(make_pair(6, "666"));mp1.swap(mp2);cout << "mp1: " << endl;
for (const auto& e : mp1)
{cout << e.first << ' ' << e.second << endl;
}cout << "mp2: " << endl;
for (const auto& e : mp2)
{cout << e.first << ' ' << e.second << endl;
}

unordered_multimap

unordered_multimap容器与unordered_map容器的底层数据结构是一样的,都是哈希表,其次,它们所提供的成员函数的接口都是基本一致的,这里就不再列举了,这两种容器唯一的区别就是,unordered_multimap容器允许键值冗余,即unordered_multimap容器当中存储的键值对的key值是可以重复的。

unordered_multimap<int, string> mp;
mp.emplace(1, "111");
mp.emplace(2, "111");
mp.emplace(3, "111");
mp.emplace(2, "111");
mp.emplace(3, "111");for (const auto& e : mp)
{cout << e.first << ' ' << e.second << ' ';
}

由于unordered_multimap容器允许键值对的键值冗余,因此该容器中成员函数find和count的意义与unordered_map容器中的也有所不同:

成员函数find功能
unordered_map容器返回键值为key的键值对的迭代器
unordered_multimap容器返回底层哈希表中第一个找到的键值为key的键值对的迭代器
成员函数count功能
unordered_map容器键值为key的键值对存在则返回1,不存在则返回0(find成员函数可替代)
unordered_multimap容器返回键值为key的键值对的个数(find成员函数不可替代)

其次,由于unordered_multimap容器允许键值对的键值冗余,调用[ ]运算符重载函数时,应该返回键值为key的哪一个键值对的value的引用存在歧义,因此在unordered_multimap容器当中没有实现[ ]运算符重载函数。

unordered_set

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

unordered_set的定义方式

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

unordered_set<int> us1; //构造int类型的空容器

方式二: 拷贝构造某同类型容器的复制品。

unordered_set<int> us2(us1); //拷贝构造同类型容器us1的复制品

方式三: 使用迭代器拷贝构造某一段内容。

string str("abcedf");
unordered_set<char> us3(str.begin(), str.end()); //构造string对象某段区间的复制品

unordered_set的接口使用

unordered_set当中常用的成员函数如下:

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

unordered_set当中迭代器相关函数如下:

成员函数功能
begin获取容器中第一个元素的正向迭代器
end获取容器中最后一个元素下一个位置的正向迭代器

使用示例:

int main()
{unordered_set<int> st;st.insert(1);st.insert(4);st.insert(4);st.insert(2);st.insert(3);st.insert(2);//去重 遍历容器元素方式一for (const auto& e : st){cout << e << ' '; // 1 4 2 3}cout << endl;//删除元素方式一 使用key值st.erase(1);//删除元素方式二 使用迭代器unordered_set<int>::iterator it = st.find(1);if (it != st.end()){st.erase(it);}//遍历容器元素方式二unordered_set<int>::iterator it = st.begin();while(it != st.end()){cout << *it << ' '; //1 4 3 2it++;}cout << endl;//容器中值为2的元素cout << st.count(2) << endl;//容器大小cout << st.size() << endl;//判断容器是否为空,为空返回真,否则假cout << st.empty() << endl;//交换两个容器的数据unordered_set<int> rst( {5, 4, 6, 7} );rst.swap(rst);for (const auto& e : rst){cout << e << ' ';}cout << endl;return 0;
}

unordered_multiset

unordered_multiset容器与unordered_set容器的底层数据结构是一样的,都是哈希表,其次,它们所提供的成员函数的接口都是基本一致的,这里就不再列举了,这两种容器唯一的区别就是,unordered_multiset容器允许键值冗余,即unordered_multiset容器当中存储的元素是可以重复的。

unordered_multiset<int> st;
st.insert(1);
st.insert(1);
st.insert(2);
st.insert(2);
st.insert(3);
st.insert(3);for (const auto& e : st)
{cout << e << ' '; // 1 1 2 2 3 3
}
cout << endl;

由于unordered_multimap容器允许键值对的键值冗余,因此该容器中成员函数find和count的意义与unordered_map容器中的也有所不同:

成员函数find功能
unordered_map容器返回键值为key的键值对的迭代器
unordered_multimap容器返回底层哈希表中第一个找到的键值为key的键值对的迭代器
成员函数count功能
unordered_map容器键值为key的键值对存在则返回1,不存在则返回0(find成员函数可替代)
unordered_multimap容器返回键值为key的键值对的个数(find成员函数不可替代)

其次,由于unordered_multimap容器允许键值对的键值冗余,调用[ ]运算符重载函数时,应该返回键值为key的哪一个键值对的value的引用存在歧义,因此在unordered_multimap容器当中没有实现[ ]运算符重载函数。

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

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

相关文章

设计模式7大原则与UML类图详解

设计模式7大原则与UML类图详解 引言 &#x1f31f; 在软件工程领域&#xff0c;设计模式和UML&#xff08;统一建模语言&#xff09;是提高代码质量、增强系统可维护性的重要工具。设计模式提供了解决软件设计中常见问题的通用方案&#xff0c;而UML则为我们提供了一种可视化的…

计算机视觉与深度学习 | Python实现ARIMA-LSTM时间序列预测(完整源码和数据)

ARIMA-LSTM混合模型 1. 环境准备2. 数据生成(示例数据)3. 数据预处理4. ARIMA建模5. LSTM残差建模6. 混合预测7. 结果可视化完整代码说明1. **数据生成**2. **ARIMA建模**3. **LSTM残差建模**4. **混合预测**5. **性能评估**参数调优建议扩展方向典型输出以下是使用Python实现…

Docker部署单节点Elasticsearch

1.Docker部署单节点ES 1.前置条件 配置内核参数 echo "vm.max_map_count262144" >> /etc/sysctl.conf sysctl -w vm.max_map_count262144准备密码 本文所有涉及密码的配置&#xff0c;均使用通用密码 Zzwl2024。 生产环境&#xff0c;请用密码生成器生成20…

pe文件二进制解析(用c/c++解析一个二进制pe文件)

pe文件二进制解析 c解析pe文件控制台版本 #include<iostream> #include<windows.h> #include<vector>/*RVA&#xff08;相对虚拟地址&#xff09;与FOA&#xff08;文件偏移地址&#xff09;的转换1.得到 的值&#xff1a;内存地址 - ImageBase2.判断是否位…

融智学视域下的系统性认知增强框架——基于文理工三类AI助理赋能HI四阶跃迁路径

融智学视域下的系统性认知增强框架 ——基于文理工三类AI助理赋能HI四阶跃迁路径 一、如何排除50个认知偏差&#xff1a;消除50类偏差的精准矫正系统 1. 技术架构 文科AI&#xff1a; 构建文化语义场&#xff08;Cultural Semantic Field, CSF&#xff09;&#xff0c;通过…

MMDetection环境安装配置

MMDetection 支持在 Linux&#xff0c;Windows 和 macOS 上运行。它需要 Python 3.7 以上&#xff0c;CUDA 9.2 以上和 PyTorch 1.8 及其以上。 MMDetection 至今也一直更新很多个版本了&#xff0c;但是对于最新的pytorch版本仍然不支持&#xff0c;我安装的时候仍然多次遇到m…

如何实现k8s高可用

一、控制平面高可用设计 多主节点部署 • API Server 冗余&#xff1a;部署至少 3 个 Master 节点&#xff0c;每个节点运行独立的 API Server&#xff0c;通过负载均衡器&#xff08;如 Nginx、HAProxy、云厂商 LB&#xff09;对外提供统一入口。 • 选举机制&#xff1a;Sche…

记录心态和工作变化

忙中带闲的工作 其实工作挺忙的, 总是在赶各种功能点. 好巧的是iOS那边因为上架的问题耽搁了一些时间, 从而让Android的进度有了很大的调整空间. 更巧的是后端那边因为对客户端的需求不是很熟悉, 加上Android海外这块的业务他也是第一次接触. 所以需要给他留一些时间把各个环节…

JVM 双亲委派机制

一、从 JDK 到 JVM&#xff1a;Java 运行环境的基石 在 Java 开发领域&#xff0c;JDK&#xff08;Java Development Kit&#xff09;是开发者的核心工具包。它不仅包含了编译 Java 代码的工具&#xff08;如 javac&#xff09;&#xff0c;还内置了 JRE&#xff08;Java Run…

java开发之异常

一 结构 Throwable分为Exception和error Exception分为RuntimeException&#xff08;运行时异常&#xff09;和其他异常 主动抛出运行时异常和非运行时异常的区别 1、throw RuntimeException&#xff08;或运行时异常的子类&#xff09; 编译时不会报错。 2、throw Excepti…

MySQL 中 JOIN 和子查询的区别与使用场景

目录 一、JOIN:表连接1.1 INNER JOIN:内连接1.2 LEFT JOIN:左连接1.3 RIGHT JOIN:右连接1.4 FULL JOIN:全连接二、子查询:嵌套查询2.1 WHERE 子句中的子查询2.2 FROM 子句中的子查询2.3 SELECT 子句中的子查询三、JOIN 和子查询的区别3.1 功能差异3.2 性能差异3.3 使用场…

2025年第三届盘古石杯初赛(智能冰箱,监控部分)

前言 所以去哪里可以取到自己家里的智能家居数据呢&#xff1f;&#xff1f;&#xff1f;&#xff1f; IOT物联网取证 1、分析冰箱&#xff0c;请问智能冰箱的品牌&#xff1f; [答案格式&#xff1a;xiaomi] Panasonic2、请问智能冰箱的型号&#xff1f; [答案格式&#x…

【强化学习】强化学习算法 - 马尔可夫决策过程

文章目录 马尔可夫决策过程 (Markov Decision Process, MDP)1. MDP 原理介绍2. MDP 建模/实现步骤3. MDP 示例&#xff1a;简单网格世界 (Grid World) 马尔可夫决策过程 (Markov Decision Process, MDP) 1. MDP 原理介绍 马尔可夫决策过程 (MDP) 是强化学习 (Reinforcement L…

用户现场不支持路由映射,如何快速将安防监控EasyCVR视频汇聚平台映射到公网?

一、方案背景​ 随着数字化安防与智能交通管理发展&#xff0c;视频监控远程管理需求激增。EasyCVR作为专业视频融合平台&#xff0c;具备多协议接入等核心功能&#xff0c;是智能监控的重要工具。但实际部署中&#xff0c;当EasyCVR处于内网且路由器无法进行端口映射时&#…

MODBUS RTU调试助手使用方法详解

一、软件简介 485调试助手是一款常用的串口通信调试工具&#xff0c;专门用于RS-485总线设备的测试、调试和通信监控。它支持多种串口参数设置&#xff0c;提供数据收发功能&#xff0c;是工业现场调试的必备工具之一。 二、软件安装与启动 1. 系统要求 Windows 7/10/11操作…

ECMAScript 2018(ES2018):异步编程与正则表达式的深度进化

1.版本背景与发布 发布时间&#xff1a;2018年6月&#xff0c;由ECMA International正式发布&#xff0c;标准编号为ECMA-262 9th Edition。历史意义&#xff1a;作为ES6之后的第三次年度更新&#xff0c;ES2018聚焦于异步编程、正则表达式和对象操作的标准化&#xff0c;推动…

【C语言】链接与编译(编译环境 )

前言&#xff1a; 在前面讲解文件操作&#xff0c;了解了文件的类别&#xff0c;文件的打开与关闭&#xff0c;字符读写函数&#xff0c; 字符串读写函数&#xff0c;格式化输入输出函数 在C语言编程中&#xff0c;编译与链接是将源代码转化为可执行程序的关键步骤。为了详细…

Java视频流RTMP/RTSP协议解析与实战代码

在Java中实现视频直播的输入流处理&#xff0c;通常需要结合网络编程、多媒体处理库以及流媒体协议&#xff08;如RTMP、HLS、RTSP等&#xff09;。以下是实现视频直播输入流的关键步骤和技术要点&#xff1a; 1. 视频直播输入流的核心组件 网络输入流&#xff1a;通过Socket或…

系分论文《论系统需求分析方法及应用》

系统分析师论文范文系列 【摘要】 2022年6月&#xff0c;我作为系统分析师参与了某金融机构“智能信贷风控系统”的建设项目。该系统旨在通过对业务流程的数字化重构&#xff0c;优化信贷审批效率并降低风险。项目涉及信贷申请、资质审核、风险评估、额度审批等核心流程&#x…

stack和queue简单模拟实现

stackreverse_iteratorqueuepriority_queue仿函数具体代码 stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO context (last-in first-out), where elements are inserted and extracted only from one end of the container. 上述描…