c++ STL系列——(五)map
目录
引言
特点
包含头文件
基本特性
基本操作
插入元素
访问元素
移除元素
检查是否包含某个键
获取元素数量
高级特性
迭代器
自定义比较函数
实际应用
统计字符出现次数
缓存最近访问的元素
总结
引言
在C++中,标准模板库(STL)的 map 是一种非常有用的关联式容器。它提供了一种将键值对(key-value pair)相关联的方式,使得可以通过键(key)快速地查找、插入或删除元素。map 的设计使得它适用于许多不同的应用场景,并且在实际编程中被广泛使用。本文将深入探讨C++ STL中map的特性、用法以及实际应用。
特点
map 是 C++ STL 中的关联式容器,具有以下特点:
-
键值对存储: map 存储的数据以键值对的形式存在,每个元素包含一个键和一个与之关联的值。这种键值对的关联方式使得可以通过键快速地查找到对应的值,实现了高效的查找操作。
-
自动排序: map 内部通常采用红黑树(Red-Black Tree)作为底层数据结构实现,这保证了元素按照键的顺序自动排序。因此,无论何时插入新元素或者执行查找操作,map 中的元素都会保持有序状态,提供了稳定的性能。
-
唯一键: map 中的键是唯一的,每个键只能对应一个值。这意味着相同的键不会重复存在于 map 中,确保了键值对的唯一性。
-
高效的查找操作: 由于 map 内部使用了平衡二叉搜索树的数据结构,因此查找操作的时间复杂度为 O(log n),其中 n 是 map 中键值对的数量。这使得可以在较大规模的数据集合中快速定位指定键的值。
-
动态插入和删除: map 支持动态地插入和删除键值对,且插入和删除操作的时间复杂度也为 O(log n)。这使得可以根据需要灵活地更新 map 中的数据集合。
-
迭代器支持: map 提供了迭代器接口,允许对容器中的键值对进行遍历和操作。通过迭代器,可以方便地访问 map 中的元素,并进行相应的操作,如遍历、查找等。
包含头文件
要使用map,首先需要包含相应的头文件:
#include <map>
基本特性
map是一个关联式容器,支持自动排序。它存储键值对,每个键只能出现一次,而值可以出现多次。以下是创建一个map的基本语法:
std::map<Key, Value> myMap;
这里的Key代表键的类型,Value代表值的类型。
基本操作
插入元素
向map中插入元素可以使用insert()方法:
myMap.insert(std::pair<Key, Value>(key, value));
这将把键值对(key, value)添加到map中。
访问元素
要访问map中的元素,可以使用[]运算符:
Value myValue = myMap[key];
这将返回与指定键key相关联的值。
移除元素
从map中移除元素可以使用erase()方法:
myMap.erase(key);
这将把与指定键key相关联的键值对从map中移除。
检查是否包含某个键
通过count()方法可以检查map中是否包含指定的键:
if (myMap.count(key)) {// map中包含指定的键key
}
获取元素数量
使用size()方法可以获取map中键值对的数量:
int mapSize = myMap.size();
高级特性
迭代器
map支持迭代器,可以用于遍历map中的所有键值对。以下是使用迭代器遍历map的基本语法:
std::map<Key, Value>::iterator it;
for (it = myMap.begin(); it != myMap.end(); ++it) {// 处理键值对(it->first, it->second)
}
这里的it是一个迭代器,可以用来访问map中的键值对。it->first表示迭代器指向的键,it->second表示迭代器指向的值。
自定义比较函数
在默认情况下,map根据键的自然顺序进行排序。但是,如果需要根据其他方式进行排序,可以自定义比较函数。以下是创建一个使用自定义比较函数的map的基本语法:
struct Compare {bool operator()(const Key& key1, const Key& key2) {// 自定义比较逻辑}
};
std::map<Key, Value, Compare> myMap;
这里的Compare是自定义的比较函数,可以根据自己的需求进行实现。
实际应用
统计字符出现次数
在字符串处理中,我们经常需要统计每个字符出现的次数。这可以使用map来实现:
std::string str = "hello world";
std::map<char, int> charCount;
for (char c : str) {if (c != ' ') {++charCount[c];}
}
for (auto it : charCount) {std::cout << it.first << ": " << it.second << std::endl;
}
缓存最近访问的元素
在缓存中,我们通常需要保留最近访问的元素,以便快速地访问它们。这可以使用map来实现:
const int CACHE_SIZE = 10;
std::map<std::string, std::string> cache;
void getFromCache(const std::string& key) {std::string value = cache[key];// ...
}
void setToCache(const std::string& key, const std::string& value) {if (cache.size() == CACHE_SIZE) {cache.erase(cache.begin());}cache[key] = value;
}
总结
在C++ STL中,map是一种非常有用的关联式容器,它提供了一种将键值对相关联的方式,使得可以通过键值快速地查找、插入或删除元素。通过本文的介绍,你应该对map的基本特性、操作和高级特性有了更加深入的了解。在实际编程中,合理地运用map可以帮助我们解决各种问题,提高代码的效率和可读性。
相关文章:
c++ STL系列——(五)map
目录 引言 特点 包含头文件 基本特性 基本操作 插入元素 访问元素 移除元素 检查是否包含某个键 获取元素数量 高级特性 迭代器 自定义比较函数 实际应用 统计字符出现次数 缓存最近访问的元素 总结 引言 在C中,标准模板库(STL…...
Huggingface 文档翻译完毕
Accelerate 0.27 中文文档音频课程文档AutoTrain 中文文档AWS 中文文档竞赛中文文档Diffusers 0.26 中文文档深度强化学习课程文档数据集服务器中文文档Datasets 2.17 中文文档 Evaluate 0.4 中文文档Huggingface.js 中文文档Hub 中文文档Hub 客户端库 JS 0.20 中文文档推理 AP…...
C++中类的6个默认成员函数 【拷贝构造函数】
文章目录 拷贝构造函数的使用拷贝构造对于自定义类型【浅拷贝】深拷贝拷贝构造函数典型调用场景 拷贝构造函数的使用 在前几章学习对象的时候,我们有的时候需要一个与已存在对象一某一样的新对象 那在创建对象时,可否创建一个与已存在对象一某一样的新对…...
【前端高频面试题--Vuex下篇】
🚀 作者 :“码上有前” 🚀 文章简介 :前端高频面试题 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬前端高频面试题--Vuex篇 往期精彩内容Vuex 的原理Vuex中action和mutation的区别Vuex 和 localStor…...
MySQL性能调优篇(4)-查询语句的优化与重构
MySQL数据库查询语句的优化与重构 MySQL是一种常用的关系型数据库管理系统,广泛应用于Web开发中。在实际应用中,对数据库查询语句的优化和重构是提高应用性能和响应速度的重要手段。本文将介绍一些常见的优化技巧和重构方法,帮助开发者提高数…...
LInux、源码编译安装
步骤: 步骤1:安装开发工具gcc与make,释放源代码至指定目录 yum -y install gcc make 步骤2:tar解包,释放源代码至指定目录 tar -xf /root/tools.tar.gz -C /usr/local 步骤3:./configure 配置,…...
wordpress好的网站主题
有什么好的网站主题,都分享在这里了。 蓝色风格的wordpress模板,好的wordpress网站主题,需要既好看,又好用。 https://www.zhanyes.com/qiye/6305.html 血红色的好看的wordpress主题,布局经典,设计好的&am…...
【Java多线程】对进程与线程的理解
目录 1、进程/任务(Process/Task) 2、进程控制块抽象(PCB Process Control Block) 2.1、PCB重要属性 2.2、PCB中支持进程调度的一些属性 3、 内存分配 —— 内存管理(Memory Manage) 4、线程(Thread)…...
C# CAD交互界面-自定义面板集-查找定位(六)
运行环境 vs2022 c# cad2016 调试成功 一、代码说明 1. 类成员变量声明: List<ObjectId> objectIds new List<ObjectId>(); // 用于存储AutoCAD实体对象的ObjectId列表 private static Autodesk.AutoCAD.Windows.PaletteSet _ps2; // 自定义浮动面板…...
5.7 BCC工具之disksnoop.py解读
一,disksnoop.py简介 disksnoop工具用于追踪块设备的I/O操作的延迟,它会在每次I/O执行完成后打印一行摘要信息。我们根据这些摘要日志,来分析当前的I/O操作是否存在延迟,以判断I/O是否达到了瓶颈。 二,代码示例 #!/usr/bin/python # # disksnoop.py Trace block device…...
QT:实现图片选择器
一、效果图 二、用到的类 qApp:可以快速获取到项目目录位置。 QSettings :编写config文件,记录上次打开图片的位置,下次打开图片会从上次的位置查找图片。 QPixmap:用于图片的缩放,防止图片过小࿰…...
LLM大模型相关问题汇总---包括问题与答案
一、基础篇 1. 目前主流的开源模型体系有哪些? - Transformer体系:由Google提出的Transformer模型及其变体,如BERT、GPT等。 - PyTorch Lightning:一个基于PyTorch的轻量级深度学习框架,用于快速原型设计和实验…...
自动化测试定位不到元素怎么办?
1.动态id定位不到元素 分析原因:每次打开页面,ID都会变化。用ID去找元素,每次刷新页面ID都会发生变化。 解决方案:推荐使用xpath的相对路径方法或者cssSelector查找到该元素。 2.iframe原因定位不到元素 分析原因:…...
1 scala集合-数组
1 定长数组 定长数组,是指数组长度不可变。定义定长数组的方法有如下两种: 方法1: var/val variable_name new Array[元素类型](数组长度) // 通过制定长度定义例如,定义一个长度为20的Int 类型数组。 scala> val a new …...
双场板功率GaN HEMT电容模型以精确模拟开关行为
标题:Capacitance Modeling in Dual Field-Plate Power GaN HEMT for Accurate Switching Behavior(TED.16年) 摘要 本文提出了一种基于表面电位的紧凑模型,用于模拟具有栅极和源极场板(FP)结构的AlGaN/G…...
OpenCV Mat实例详解 四
OpenCV Mat实例详解三中详细介绍来了OpenCV Mat类的公有静态成员函数,下面介绍OpenCV Mat类的其他常用成员函数。 OpenCV Mat类常用成员函数 Mat & adjustROI (int dtop, int dbottom, int dleft, int dright); dtop ROI 上边界移动值,如…...
Fluke ADPT 连接器新增对福禄克万用 Fluke 106 的支持
所需设备: 1、Fluke ADPT连接器; 2、Fluke 106; Fluke 106 拆机图: 显示界面如下图: 并且可以将波形导出到EXCEL: 福禄克万用表需要自己动手改造!!!...
算法-3-基本的数据结构
单双链表 1.单链表双链表如何反转 import java.util.ArrayList; import java.util.List;public class Code01_ReverseList {public static class Node {public int value;public Node next;public Node(int data) {value data;}}public static class DoubleNode {public int…...
探秘Java反射:灵活编程的利器
前言 大家好,我是chowley,不知道大家在学习Java的过程中有没有听过反射的概念,今天我来总结一下我心中的Java反射。 在Java编程中,反射是一种强大的工具,它允许程序在运行时检查和操作类、方法、属性等,而…...
记录 | ubuntu pyqt5 pycharm配置
Ubuntu16.04pycharmpyqt5安装与配置_ubuntu pycharm pyqt5-CSDN博客pycharm激活码 6ZUMD7WWWU-eyJsaWNlbnNlSWQiOiI2WlVNRDdXV1dVIiwibGljZW5zZWVOYW1lIjoiSmV0cyBHcm91cCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
