C++容器map及unordered_map底层实现和性能上有所不同

std::map 和 std::unordered_map 都是 C++ 标准库中用于实现关联容器的类模板,但它们在底层实现和性能上有所不同。

1. std::map:
   - 使用红黑树实现,保持元素的有序性。因此,所有操作的时间复杂度都是 O(log n),其中 n 是元素个数。
   - 元素按键排序存储,键是唯一的,每个键最多只能出现一次。
   - 适用于需要有序存储键值对的情况,例如需要按照键的顺序进行遍历或查找的场景。

当需要按照键的顺序进行存储和访问时,可以使用 std::map例如,存储学生的分数,并按照学生姓名的字典顺序进行排序:

#include <iostream>
#include <map>
#include <string>int main() {std::map<std::string, int> studentScores;// 添加学生分数studentScores["Alice"] = 95;studentScores["Bob"] = 87;studentScores["Charlie"] = 92;// 遍历输出学生分数(按姓名字典顺序)for (const auto& pair : studentScores) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}

2. std::unordered_map:
   - 使用哈希表实现,插入、查找、删除操作的平均时间复杂度为 O(1),但最坏情况下可能会达到 O(n)。
   - 元素存储时没有顺序限制,但键必须是唯一的。
   - 适用于对插入和查找性能有较高要求,并且不要求元素有序存储的情况。

因此,选择 std::map 还是 std::unordered_map 取决于具体的需求。如果需要有序存储或者操作少量数据,可以选择 std::map;如果对性能要求较高,并且不需要有序存储,可以选择 std::unordered_map。

#include <iostream>
#include <unordered_map>
#include <string>int main() {std::unordered_map<std::string, int> studentScores;// 添加学生分数studentScores["S001"] = 95;studentScores["S002"] = 87;studentScores["S003"] = 92;// 查找学生分数std::string studentID = "S002";if (studentScores.find(studentID) != studentScores.end()) {std::cout << "Score of student " << studentID << ": " << studentScores[studentID] << std::endl;} else {std::cout << "Student " << studentID << " not found." << std::endl;}return 0;
}

--------

`std::unordered_map` 提供了一系列方法来进行元素的插入、查找、删除等操作。以下是一些常用的方法:

1. **插入元素**:
   - `insert`: 将键值对插入到 `std::unordered_map` 中。
   
2. **访问元素**:
   - `operator[]`: 通过键来访问元素的值。
   - `at`: 通过键来访问元素的值,类似于 `operator[]`,但提供了边界检查。
   
3. **查找元素**:
   - `find`: 查找给定键的元素,返回指向该元素的迭代器,如果未找到,则返回 `std::unordered_map::end()`。

   - `count`: 返回指定键的元素个数,由于每个键在 `std::unordered_map` 中最多出现一次,因此结果为 0 或 1。
   
4. **删除元素**:
   - `erase`: 删除指定键的元素或一定范围内的元素。
   - `clear`: 清空 `std::unordered_map` 中的所有元素。
   
5. **容量相关**:
   - `empty`: 检查 `std::unordered_map` 是否为空。
   - `size`: 返回 `std::unordered_map` 中元素的数量。
   
6. **哈希策略**:
   - `hash_function`: 返回哈希函数对象,用于计算键的哈希值。
   - `key_eq`: 返回用于比较键是否相等的函数对象。

这些方法使得在 `std::unordered_map` 中进行元素的操作变得非常方便。

----------------------

`std::map` 提供了一系列方法来进行元素的插入、查找、删除等操作。以下是一些常用的方法:

1. **插入元素**:
   - `insert`: 将键值对插入到 `std::map` 中。
   
2. **访问元素**:
   - `operator[]`: 通过键来访问元素的值。
   - `at`: 通过键来访问元素的值,类似于 `operator[]`,但提供了边界检查。
   
3. **查找元素**:
   - `find`: 查找给定键的元素,返回指向该元素的迭代器,如果未找到,则返回 `std::map::end()`。
   - `count`: 返回指定键的元素个数,由于每个键在 `std::map` 中最多出现一次,因此结果为 0 或 1。
   
4. **删除元素**:
   - `erase`: 删除指定键的元素或一定范围内的元素。
   - `clear`: 清空 `std::map` 中的所有元素。
   
5. **容量相关**:
   - `empty`: 检查 `std::map` 是否为空。
   - `size`: 返回 `std::map` 中元素的数量。
   
6. **迭代器**:
   - `begin`: 返回指向第一个元素的迭代器。
   - `end`: 返回指向最后一个元素之后位置的迭代器。

   
7. **比较操作**:
   - `key_comp`: 返回用于比较键的函数对象。
   - `value_comp`: 返回用于比较值的函数对象。

这些方法使得在 `std::map` 中进行元素的操作变得非常方便。

 

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

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

相关文章

算法--贪心算法

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。贪心算法在有最优子结构的问题中尤其有效&#xff0c;这意味着局部最优解能决定全局最优解。简单来说&#xff0c;贪心…

零基础学习数据库SQL语句之查询表中数据的DQL语句

是用来查询数据库表的记录的语句 在SQL语句中占有90%以上 也是最为复杂的操作 最为繁琐的操作 DQL语句很重要很重要 初始化数据库和表 USE dduo;create table tb_emp(id int unsigned primary key auto_increment comment ID,username varchar(20) not null unique comment…

【C++基础】内联函数

一&#xff0c;内联函数概念 以inline修饰的函数叫做内联函数。 编译时&#xff0c;C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用栈帧的开销。 内联函数提升程序运行的效率。 二&#xff0c;特性 1&#xff0c;inline是一种以空间换时间的做法 2&#xff…

glob库和split函数的用法

dir为一个文件夹&#xff0c;存放着三张jpg格式的图像 import glob dir rD:\My Data\Figure image_DCE_files glob.glob(f{dir}/*.jpg) image_DCE_files glob库可以获取文件夹下为个文件的绝对路径,会保存到一个列表中 获取的路径可以拆分为列表 image_DCE_files[1].split(…

写自己的c库----小话c语言(19)

Q&#xff1a; 对于c代码&#xff0c;经常可能被c代码使用&#xff0c;所以经常需要使用extern "C"语句&#xff0c;老是写这段代码真是很烦人&#xff0c;有什么好的方法&#xff1f; A&#xff1a; 对于重复代码来说&#xff0c;宏无疑是个很好的方法。 #if defin…

HTTP常见面试题(一)

3.1 HTTP 常见面试题 HTTP基本概念 HTTP 是超文本传输协议&#xff0c;也就是HyperText Transfer Protocol。 HTTP 的名字「超文本协议传输」&#xff0c;它可以拆成三个部分&#xff1a; 超文本 传输 协议 HTTP 是一个用在计算机世界里的协议。它使用计算机能够理解的语…

Lora训练笔记1——快速上手

准备工具 AKI大佬的整合包&#xff0c;一键解压即可。 度盘链接 提取码&#xff1a;p8uy 图片预处理 图片预处理&#xff1a;以一定规则裁剪原始的训练素材图片&#xff0c;并进行打标处理。 新建两个文件夹 input&#xff1a;存放原始图片的文件夹 preprocess-output:…

西湖大学赵世钰老师【强化学习的数学原理】学习笔记-1、0节

强化学习的数学原理是由西湖大学赵世钰老师带来的关于RL理论方面的详细课程&#xff0c;本课程深入浅出地介绍了RL的基础原理&#xff0c;前置技能只需要基础的编程能力、概率论以及一部分的高等数学&#xff0c;你听完之后会在大脑里面清晰的勾勒出RL公式推导链条中的每一个部…

OpenCV如何使用 GDAL 读取地理空间栅格文件(72)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV的周期性噪声去除滤波器(70) 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目录 目标 代码&#xff1a; 解释&#xff1a; 如何使用 GDAL 读取栅格数据 注意 …

C++进阶----多态

1.多态的概念 1.1 概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同类型的对象去完成时会 产生出不同的状态。 举个例子&#xff1a;比如有一个基类Animal&#xff0c;它有两个子类Dog和Cat。每个…

利用 pcap 库和 select 函数实现网络数据包实时捕获

概述 在网络编程中&#xff0c;实时捕获网络数据包是一项常见的任务。这对于网络安全分析、网络流量监控以及网络性能调优等领域都非常重要。在本篇博客中&#xff0c;我们将介绍如何利用 pcap 库和 select 函数实现网络数据包的实时捕获&#xff0c;以及一些相关的技巧和应用…

数据结构---时间复杂度+空间复杂度

算法(algorithm)简单说就是解决问题的方法。方法有好坏&#xff0c;同样算法也是&#xff0c;有效率高的算法&#xff0c;也有效率低的算法。衡量算法的好坏一般从时间和空间两个维度衡量&#xff0c;也就是本文要介绍的时间复杂度和空间复杂度。有些时候&#xff0c;时间与空间…

2024年第七届大数据技术国际会议(ICBDT 2024)即将召开!

2024年第七届大数据技术国际会议&#xff08;ICBDT 2024&#xff09;将于2024年9月20-22日在中国杭州的浙江工商大学举行。数据驱动未来&#xff0c;技术引领潮流。从数据挖掘算法的优化&#xff0c;到数据处理速度的提升&#xff0c;再到数据安全与隐私保护的进步&#xff0c;…

求解ab串

【问题描述】 给定一个由字符a和字符b组成的字符串&#xff0c;可以删除若干字符&#xff0c;使得剩下来的字符串满足前后段为a&#xff0c;中间段为b&#xff08;aaa....aaabbbb.....bbbbaaa.....aaa&#xff09;,区段可以没有字符&#xff08;ba,ab,b,aa都是合法的&#xff…

Scikit是什么?

目录 一、Scikit是什么&#xff1f; 二、用Scikit做一个简单房价预测例子 三、sklearn知识点 一、Scikit是什么&#xff1f; Scikit就是scikit-learn&#xff0c;是一个免费软件机器学习库。 https://scikit-learn.org/stable/https://scikit-learn.org/stable/ 用于预测数…

SoundStream: 下一代的神经网络音频编解码器,实时压缩不牺牲音质

音频编解码技术的目标是&#xff0c;通过减少音频文件的大小来节省存储空间或减轻网络传输的负担。理想的情况下&#xff0c;即使音频被压缩&#xff0c;我们听到的声音与原版也应该没有任何区别。 过去&#xff0c;已经有不少编解码技术被开发出来&#xff0c;满足了这些需求…

[重学Python] Day8 面向对象编程:详解基于接口编程、组合优于继承、控制反转及SOLID五个原则

[重学Python] Day8 面向对象编程&#xff1a;详解基于接口编程、组合优于继承、控制反转及SOLID五个原则 一、面向对象编程的理念1、基于接口编程面向对象中基于接口编程主要有以下一些优点和特点 2、组合优于继承组合优于继承的优点和特点主要包括以下几点 3、控制反转通过控制…

Day13-JavaWeb开发-事务管理(回顾/进阶)AOP基础(入门/概念)AOP进阶(通知类型/顺序/切点表达式)AOP案例

1. 事务管理 1.1 事务管理-事务回顾 1.2 事务管理-事务进阶 rollbackFor propagetion 2. AOP基础 2.1 AOP基础-快速入门 2.2 AOP基础-核心概念 3. AOP进阶 3.1 AOP进阶-通知类型 3.2 AOP进阶-通知顺序 3.3 切入点表达式-execution 3.4 切入点表达式-annottation 3.5 AOP进阶…

Flutter路由跳转的两种方式

1.基本路由跳转&#xff1a;文件引入在你要跳转的页面引入 ElevatedButton(onPressed: () {Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) {return const NewsPage(arguments: {"title": "基本路由新闻页面传值","a…

Linux中对文件的操作(二)

文件描述符 文件描述符fd是通过open打开某一文件后返回的非负整数。在Linux系统中默认存在的文件描述符有0——标准输入&#xff0c;1——标准输出&#xff0c;2——标准错误 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include &…