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…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?
在现代前端开发中,Utility-First (功能优先) CSS 框架已经成为主流。其中,Tailwind CSS 无疑是市场的领导者和标杆。然而,一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...
