STL之map容器代码详解
基础概念

简介:
- map中所有元素都是pair。
- pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)。
- 所有元素都会根据元素的键值自动排序。
本质:
map/multimap属于关联式容器,底层结构是用二叉树实现。
优点:
可以根据key值快速找到value值。
map和multimap区别:
map不允许容器中有重复key值元素;
multimap允许容器中有重复key值元素。
代码示例
Talk is cheap, show me the code.
#include<iostream>
using namespace std;
#include<map>void printMap(const map<int, int>& mm)
{for (map<int, int>::const_iterator it = mm.begin(); it != mm.end(); it++){cout << "Key is: " << (*it).first << "Value is: " << (*it).second << endl;}
}/*
构造:
map<T1, T2> mp; //map默认构造函数:
map(const map &mp); //拷贝构造函数
赋值:
map& operator=(const map &mp); //重载等号操作符
*/void test01()
{map<int, int> mp;mp.insert(pair<int, int>(1, 10));mp.insert(pair<int, int>(2, 20));mp.insert(pair<int, int>(3, 30));mp.insert(pair<int, int>(4, 40));printMap(mp);map<int, int> mp2(mp);printMap(mp2);map<int, int> mp3;mp3 = mp2;printMap(mp3);
}/*
大小和交换函数原型:
size(); //返回容器中元素的数目
empty(); //判断容器是否为空
swap(st); //交换两个集合容器
*/void test02()
{map<int, int> mp;mp.insert(pair<int, int>(1, 10));mp.insert(pair<int, int>(2, 20));mp.insert(pair<int, int>(3, 30));mp.insert(pair<int, int>(4, 40));printMap(mp);if (mp.empty()){cout << "Empty!" << endl;}else{cout << mp.size() << endl;}map<int, int> mp2;mp2.insert(pair<int, int>(5, 50));cout << "Swap Before: " << endl;printMap(mp);printMap(mp2);cout << "Swap After: " << endl;mp.swap(mp2);printMap(mp);printMap(mp2);
}/*
插入和删除函数原型:
insert(elem); //在容器中插入元素。
clear(); //清除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(key); //删除容器中值为key的元素。
*/void test03()
{map<int, int> mp;mp.insert(pair<int, int>(1, 10));mp.insert(pair<int, int>(2, 20));mp.insert(pair<int, int>(3, 30));mp.insert(pair<int, int>(4, 40));printMap(mp);map<int, int>::iterator it = mp.begin();mp.erase(it);printMap(mp);mp.erase(3);printMap(mp);mp.erase(mp.begin(), mp.end());printMap(mp);
}/*
map查找和统计函数原型:
find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key); //统计key的元素个数
*/void test04()
{map<int, int> mp;mp.insert(pair<int, int>(1, 10));mp.insert(pair<int, int>(2, 20));mp.insert(pair<int, int>(3, 30));mp.insert(pair<int, int>(4, 40));printMap(mp);if (mp.find(3)!=mp.end()){cout << "Exists: " << (*mp.find(3)).second << endl;}else{cout << "Not Exists" << endl;}int num = mp.count(3);cout << num << endl;
}/*
map容器排序:
利用仿函数,可以改变排序规则
*/
class myCompare
{
public:bool operator()(int val1,int val2)const //这里需要加const{return val1 > val2;}
};void test05()
{map<int, int,myCompare> mp;mp.insert(pair<int, int>(1, 10));mp.insert(pair<int, int>(2, 20));mp.insert(pair<int, int>(3, 30));mp.insert(pair<int, int>(4, 40));for (map<int, int,myCompare>::const_iterator it = mp.begin(); it != mp.end(); it++){cout << "Key is: " << (*it).first << "Value is: " << (*it).second << endl;}}int main()
{test01();test02();test03();test04();test05();system("pause");return 0;
}
应用场景
C++的STL(标准模板库)中的map容器是一个关联容器,它提供了键值对的存储和检索功能,其中每个键都是唯一的。map基于红黑树实现,因此它在查找、插入和删除操作上具有较好的性能。以下是map容器在实际项目中的一些常见应用场景的例子:
-
字典/词典:
map常用于实现字典或词典的功能,其中键表示单词,值表示对应的释义、定义或其他相关信息。这在文本处理、自然语言处理等应用中很常见。#include <iostream> #include <map> #include <string>int main() {std::map<std::string, std::string> dictionary;// 添加词条dictionary["apple"] = "a fruit";dictionary["book"] = "a set of written or printed pages, usually bound with a protective cover";dictionary["car"] = "a four-wheeled motor vehicle used for transportation";// 查找释义std::cout << "Meaning of 'book': " << dictionary["book"] << std::endl;return 0; } -
配置管理:
在项目中,map可用于存储配置信息,其中键是配置项的名称,而值是对应的配置值。这样可以方便地进行配置管理和查找。#include <iostream> #include <map> #include <string>int main() {std::map<std::string, std::string> config;// 添加配置项config["username"] = "john_doe";config["password"] = "secretpassword";config["server_address"] = "127.0.0.1";// 获取配置项std::cout << "Username: " << config["username"] << std::endl;return 0; } -
计数器/统计:
map可以用于实现计数器,其中键是要计数的项目,而值是计数值。这在数据分析、统计学等领域中非常有用。#include <iostream> #include <map> #include <vector>int main() {std::map<int, int> counter;std::vector<int> data = {1, 2, 3, 2, 1, 3, 4, 5, 1, 2, 4, 4, 5};// 统计每个元素出现的次数for (const auto& item : data) {counter[item]++;}// 输出统计结果for (const auto& pair : counter) {std::cout << pair.first << ": " << pair.second << " times" << std::endl;}return 0; }
这些例子只是map在实际项目中应用的冰山一角,map的灵活性和高效性使得它在许多场景下都是一个强大的工具。在实际项目中,根据需要选择合适的容器是很重要的,map通常在需要快速查找、插入和删除的情况下是一个不错的选择。
实际用例
假设我们有一个简单的任务,需要统计一段文本中每个单词出现的次数。我们可以使用map容器轻松完成这个任务。以下是一个简单的C++代码示例:
#include <iostream>
#include <map>
#include <sstream>
#include <string>int main() {// 输入文本std::string inputText = "This is a simple example. This example demonstrates the usage of map in a project.";// 使用istringstream分割单词std::istringstream iss(inputText);std::map<std::string, int> wordCount;std::string word;while (iss >> word) {// 将单词添加到map中,如果已存在则增加计数wordCount[word]++;}// 输出每个单词的出现次数std::cout << "Word frequencies:" << std::endl;for (const auto& pair : wordCount) {std::cout << pair.first << ": " << pair.second << " times" << std::endl;}return 0;
}
在这个示例中,我们使用map容器存储每个单词和其出现的次数。通过遍历文本并使用istringstream分割单词,我们可以很方便地统计每个单词的出现次数。map的优势在于它可以快速查找并更新每个单词的计数,而不需要复杂的手动管理数据结构。
这样的例子展示了在项目中使用map容器来解决实际问题时,它的简洁性和高效性。在更大规模的项目中,这种便捷的数据结构可以帮助提高代码的可读性和维护性。
相关文章:
STL之map容器代码详解
基础概念 简介: map中所有元素都是pair。pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)。所有元素都会根据元素的键值自动排序。 本质: map/multimap属于关…...
使用GRU进行天气变化的时间序列预测
本文基于最适合入门的100个深度学习项目的学习记录,同时在Google clolab上面是实现,文末有资源连接 天气变化的时间序列的难点 天气变化的时间序列预测涉及到了一系列复杂的挑战,主要是因为天气系统的高度动态性和非线性特征。以下是几个主…...
uniapp 小程序AP配网
一、TCPSocket.js 封装TCP协议 class socket {constructor() {this.connection {};}// 创建一个TCP实例establish(monitor) {this.connection wx.createTCPSocket();this.connection.connect({ address: "000.000.0.0", port: 6800 });}// 发送消息connect(messag…...
Stable Diffusion ———LDM、SD 1.0, 1.5, 2.0、SDXL、SDXL-Turbo等版本之间关系现原理详解
一、简介 2021年5月,OpenAI发表了《扩散模型超越GANs》的文章,标志着扩散模型(Diffusion Models,DM)在图像生成领域开始超越传统的GAN模型,进一步推动了DM的应用。 然而,早期的DM直接作用于像…...
GESP5级T1真题 [202309] 因数分解——O(sqrt(n))的时间复杂度,值得一看
描述 每个正整数都可以分解成素数的乘积,例如:62*3、2022 *5 现在,给定一个正整数N,请按要求输出它的因数分解式。 输入描述 输入第一行,包含一个正整数N。约定2<N<10^12 输出描述 输出一行,为N…...
Stable Diffusion 3报告
报告链接:https://stability.ai/news/stable-diffusion-3-research-paper 文章目录 要点表现架构细节通过重新加权改善整流流量Scaling Rectified Flow Transformer Models灵活的文本编码器RF相关论文 要点 发布研究论文,深入探讨Stable Diffuison 3的…...
一个足球粉丝该怎么建个个人博客?
做一个个人博客第一步该怎么做? 好多零基础的同学们不知道怎么迈出第一步。 那么,就找一个现成的模板学一学呗,毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题,那就是,那些模板都,太!…...
缩放算法优化步骤详解
添加链接描述 背景 假设数据存放在在unsigned char* m_pData 里面,宽和高分别是:m_nDataWidth m_nDataHeight 给定缩放比例:fXZoom fYZoom,返回缩放后的unsigned char* dataZoom 这里采用最简单的缩放算法即: 根据比…...
[axios]使用指南
axios使用指南 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。 axios 安装 npm安装 $ npm install axios 使用cdn <script src"https://unpkg.com/axios/dist/axios.min.js"></script> axios API axios(config)…...
HTML5基础2
drag 可以把拖放事件拆分成4个步骤 设置元素为可拖放。为了使元素可拖动,把 draggable 属性设置为 true 。 <img draggable"true"> 拖动什么。ondragstart 和 setData() const dragestart (ev)>{ev.dataTransfer.setData(play,ev.target.id)} …...
数据结构与算法-希尔排序
引言 在计算机科学中,数据结构和算法是构建高效软件系统的基石。而排序算法作为算法领域的重要组成部分,一直在各种应用场景中发挥着关键作用。今天我们将聚焦于一种基于插入排序的改进版本——希尔排序(Shell Sort),深…...
蓝桥杯算法错题记录
这里写目录标题 本文还在跟新,最新更新时间24/3/91. nextInt () next() nextLine() 的注意事项2 . 转换数据类型int ,string,charint -> string , charstring -> int ,charchar -> int , string 进制转换十六进制转化为10 进制 最大公约数 本文还在跟新&am…...
【Python 图像处理 PIL 系列 13 -- PIL 及 Image.convert 函数介绍】
文章目录 Python PIL 介绍PIL 使用介绍PIL convert 介绍PIL convert 使用示例 Python PIL 介绍 PIL 是 Python Image Library 的简称。PIL 库中提供了诸多用来处理图片的模块,可以对图片做类似于 PS(Photoshop) 的编辑。比如:改变…...
使用docker datascience-notebook进行数据分析
Jupyter/datascience-notebook 简介 jupyter/datascience-notebook 是 Docker Hub 上可用的 Docker 镜像:https://hub.docker.com/。该镜像提供了一个开箱即用的环境,用于数据科学任务,包括: Jupyter Notebook: 一个基于 Web 的…...
VR全景技术在VR看房中有哪些应用,能带来哪些好处
引言: 随着科技的不断发展,虚拟现实(VR)技术在房地产行业中的应用也越来越广泛。其中,VR全景技术在VR看房中的运用尤为突出。今天,让我们一起深入探讨VR全景技术在VR看房中的应用及其带来的种种好处。 一、…...
Winform窗体随着屏幕的DPI缩放,会引起窗体变形及字体变形,superTabControl标签字体大小不匹配
一、前言 superTabControl做的浏览器标签(cefsharp)在缩放比例(125%,150%时字体不协调) 物联网浏览器,定制浏览器,多媒体浏览器(支持H264)参考栏目文章即可 二、配置参数 app.manifest参数 dpiAware =true <application xmlns="urn:schemas-microsoft-c…...
java网络编程 01 IP,端口,域名,TCP/UDP, InetAddress
01.IP 要想让网络中的计算机能够互相通信,必须为计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机,而IP地址就是这个标识号,也就是设备的标识。 ip地址组成: ip地址分类:…...
第十篇 - 如何利用人工智能技术做好营销流量整形管理?(Traffic Shaping)- 我为什么要翻译介绍美国人工智能科技巨头IAB公司
IAB平台,使命和功能 IAB成立于1996年,总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司,互动广告局(IAB- the Interactive Advertising Bureau)自1996年成立以来,先…...
npm ERR! errno -13具体问题处理
npm ERR! errno -13具体问题处理 出现问题的报错 npm ERR! code EACCES npm ERR! syscall open npm ERR! path /Users/xxxx/.npm/_cache/index-v5/c6/06/xxxxx npm ERR! errno -13 npm ERR! npm ERR! Your cache folder contains root-owned files, due to a bug in npm ERR! …...
【Python】3. 基础语法(2) -- 语句篇
顺序语句 默认情况下, Python 的代码执行顺序是按照从上到下的顺序, 依次执行的. print("1") print("2") print("3")执行结果一定为 “123”, 而不会出现 “321” 或者 “132” 等. 这种按照顺序执行的代码, 我们称为 顺序语句. 这个顺序是很关…...
PoeCharm:10个技巧让你成为流放之路角色构建大师
PoeCharm:10个技巧让你成为流放之路角色构建大师 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 当你在流放之路中面对复杂的角色构建时,是否曾因语言障碍而错过最佳装备组合…...
为什么你的RTX 4090只能同时编码3路视频?聊聊NVENC限制背后的商业逻辑与‘曲线救国’方案
为什么RTX 4090只能同时编码3路视频?解码NVENC限制的商业密码与技术突围 当你在直播推流、影视渲染或AI训练场景中,突然遭遇"RuntimeError: NvEncoder : m_nvenc.nvEncOpenEncodeSessionEx returned error 10"的红色警告,这很可能触…...
【PolarCTF】x64
先检查下,发现是64位的程序IDA分析程序这里很明显read函数存在溢出然后可以看到后面函数Shell同时也可以找到/bin/sh字符串这里我们可以通过IDA查找攻击思路如下:填充垃圾数据pop_rdi_ret将/bin/sh传递到rdi中执行Shell函数获得shellgdb调试程序将cyclic…...
从RS485接线到云平台配置:一个真实车间电表数据采集上云的完整踩坑记录
从RS485接线到云平台配置:一个真实车间电表数据采集上云的完整踩坑记录 车间里那台老旧的电力监测系统终于到了必须升级的时候。作为项目负责人,我原本以为将电表数据通过RS485采集再上传到云平台是件标准化的"流水线作业",直到真正…...
Phi-3-Mini-128K在计算机网络教学中的应用:协议模拟与故障排查
Phi-3-Mini-128K在计算机网络教学中的应用:协议模拟与故障排查 计算机网络这门课,很多学生都觉得有点“硬核”。协议栈、数据包、三次握手、路由表……这些概念光是听起来就让人头大。传统的教学方式,要么是老师对着PPT讲,要么是…...
从薛定谔方程到Kohn-Sham方程:DFT核心原理与应用场景解析
1. 量子力学的起点:薛定谔方程与电子结构难题 要理解密度泛函理论(DFT)为何能成为计算材料科学的基石,我们需要回到量子力学的源头——薛定谔方程。这个1926年提出的方程描述了微观粒子的行为规律,其标准形式看起来异常…...
【OpenCV 实战指南】特征匹配:从暴力匹配到实战调优
1. 暴力匹配基础:从理论到OpenCV实现 第一次接触特征匹配时,我被这个看似简单实则精妙的技术深深吸引了。想象一下,你手上有两张不同角度拍摄的同一栋建筑的照片,如何让计算机自动找到两张照片中相同的窗户或装饰?这就…...
【环境解析】Android Studio 终端切换:从 cmd 到 PowerShell 引发的 gradlew 执行差异与适配
1. 当Android Studio终端突然罢工:从cmd到PowerShell的转变 最近升级Android Studio后,突然发现Terminal里熟悉的gradlew命令报错了?这不是你的问题,而是Android Studio悄悄把默认终端从cmd换成了PowerShell。这个变化看似微小&am…...
【STILT模型实操第2期】运行 STILT 模型提供 WRF 示例
目录1. 项目初始化与数据准备1.1 初始化 STILT 项目1.2 下载示例数据1.3 准备转换工具2. 核心操作步骤步骤 1:批量转换 WRF 数据步骤 2:配置 STILT 运行脚本 (r/run_stilt.r)步骤 3:运行 STILT 模型步骤 4:检查输出结果可视化轨迹…...
OpenCV写视频踩坑实录:为什么你的MP4文件打不开?从编码器选择到参数配置的避坑指南
OpenCV视频保存实战:从编码器陷阱到播放兼容性的终极解决方案 当你兴奋地运行完Python脚本,看到视频文件成功生成,却发现播放器无法打开或画面异常时,那种挫败感我深有体会。这不是简单的代码错误,而是OpenCV视频保存过…...
