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…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
