「C/C++」C++ STL容器库 之 std::map 键值对的集合容器

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

      • std::map容器深度解析
        • 1. 引用头文件
        • 2. 注意事项
        • 3. 函数构造与对象初始化
        • 4. 元素访问
        • 5. 迭代器
        • 6. 容器修改器
        • 7. 元素比较
        • 总结与应用场景

std::map容器深度解析

1. 引用头文件

在C++标准模板库(STL)中,std::map是一个重要的关联容器,它提供了基于键(key)的快速查找、插入和删除操作,同时保证元素按键排序。要使用std::map,首先需要包含其对应的头文件:

#include <map>
2. 注意事项
  • 键唯一性std::map中的键是唯一的,不允许重复。
  • 自动排序:元素会根据提供的比较函数(默认为<运算符)对键进行排序。
  • 键值对存储std::map存储的是键值对(key-value pairs),每个键都映射到一个值。
  • 不支持随机访问:由于底层实现为红黑树,std::map不支持通过下标访问元素。
3. 函数构造与对象初始化

std::map提供了多种构造函数来初始化对象:

  • 默认构造函数:创建一个空的map容器。
  • 拷贝构造函数:用另一个map容器来初始化新的map容器。
  • 赋值构造函数:通过赋值运算符从一个map容器创建另一个map容器。
  • 初始化列表构造函数:使用初始化列表来初始化map容器。
  • 迭代器范围构造函数:使用两个迭代器(指向容器或其他序列的起始和结束位置)来初始化map容器。

示例代码:

#include <map>
#include <iostream>
#include <string>int main() {// 默认构造函数std::map<std::string, int> m1;// 初始化列表构造函数std::map<std::string, int> m2 = {{"apple", 1}, {"banana", 2}, {"cherry", 3}};// 拷贝构造函数std::map<std::string, int> m3(m2);// 迭代器范围构造函数(假设有一个数组)// 注意:这里不适用数组,因为map是键值对,所以通常使用其他容器或初始化列表// 但为了演示,我们仍然可以用一个pair数组来初始化std::pair<std::string, int> arr[] = {{"date", 4}, {"elderberry", 5}, {"fig", 6}};std::map<std::string, int> m4(arr, arr + 3);// 输出map元素(自动按键排序)for (const auto& kv : m4) {std::cout << kv.first << ": " << kv.second << std::endl;}return 0;
}
4. 元素访问

在这里插入图片描述

std::map提供了多种方式来访问元素:

  • at:通过键访问元素,如果键不存在则抛出std::out_of_range异常。
  • operator[]:通过键访问元素,如果键不存在则插入一个具有该键的新元素,并返回其值的引用。
  • find:查找具有指定键的元素,并返回一个指向该元素的迭代器(如果找到)或end()迭代器(如果未找到)。

示例代码:

#include <map>
#include <iostream>
#include <string>int main() {std::map<std::string, int> m = {{"apple", 1}, {"banana", 2}, {"cherry", 3}};// 使用at访问元素try {std::cout << "Banana count: " << m.at("banana") << std::endl;} catch (const std::out_of_range& e) {std::cerr << "Key not found: " << e.what() << std::endl;}// 使用operator[]访问元素(如果键不存在则插入)m["date"] = 4;std::cout << "Date count: " << m["date"] << std::endl;// 使用find查找元素auto it = m.find("cherry");if (it != m.end()) {std::cout << "Cherry count: " << it->second << std::endl;} else {std::cout << "Cherry not found in the map." << std::endl;}return 0;
}
5. 迭代器

在这里插入图片描述

std::map的迭代器是双向迭代器,支持向前和向后遍历容器中的元素。迭代器指向的是键值对(std::pair<const Key, T>),其中Key是键的类型,T是值的类型。由于std::map的迭代器与底层红黑树结构相关联,因此在插入和删除操作时(除了被删除的迭代器外),其余迭代器仍然有效。

#include <iostream>  
#include <map>  
#include <string>  int main() {  std::map<std::string, int> myMap = {{"apple", 1}, {"banana", 2}, {"cherry", 3}};  // 范围for循环(range-based for loop)for (const auto& pair : myMap) {  std::cout << pair.first << ": " << pair.second << std::endl;  }  // 迭代器遍历for (auto it = myMap.begin(); it != myMap.end(); ++it) {  std::cout << it->first << ": " << it->second << std::endl;  }  // 反向迭代器遍历for (auto it = myMap.rbegin(); it != myMap.rend(); ++it) {  std::cout << it->first << ": " << it->second << std::endl;  }  return 0;  
}
6. 容器修改器

在这里插入图片描述

std::map提供了多种成员函数来修改容器:

  • insert:插入键值对(如果键已存在,则插入失败,除非使用带有提示的插入方法)。
  • erase:删除具有指定键的元素。
  • clear:清除所有元素。
  • swap:交换两个map容器的元素。

示例代码:

#include <map>
#include <iostream>
#include <string>int main() {std::map<std::string, int> m = {{"apple", 1}, {"banana", 2}, {"cherry", 3}};// 插入元素auto result = m.insert({"date", 4});if (result.second) {std::cout << "Inserted date successfully." << std::endl;} else {std::cout << "Date already exists in the map." << std::endl;}// 删除元素m.erase("banana");// 清除所有元素// m.clear();// 输出修改后的map元素for (const auto& kv : m) {std::cout << kv.first << ": " << kv.second << std::endl;}return 0;
}
7. 元素比较

在这里插入图片描述

std::map中的元素是根据提供的比较函数(默认为<运算符)对键进行排序的。因此,可以直接使用比较运算符来比较std::map中的键或迭代器指向的键值对中的键。

总结与应用场景

std::map是一个功能强大的关联容器,它提供了基于键的快速查找、插入和删除操作,同时保证元素按键排序。std::map适用于需要快速根据键查找、插入和删除元素的场景,如:

  • 字典或符号表:将字符串映射到整数、浮点数或其他类型的值。
  • 缓存:将键映射到缓存的值,以加快数据访问速度。
  • 配置管理:将配置选项的名称映射到其值。
  • 需要保持元素有序性的场景:如任务调度、资源管理等,其中键的自然顺序或自定义顺序很重要。

通过合理使用std::map容器,可以显著提高程序的效率和可靠性,特别是在需要处理大量键值对且需要快速查找和插入操作的场景中。


在这里插入图片描述

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

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

相关文章

鸿蒙网络编程系列25-TCP回声服务器的实现

1. TCP回声服务器实现可行性 在前文鸿蒙网络编程系列2-UDP回声服务器的实现中&#xff0c;介绍了什么是回声服务器&#xff0c;并且基于UDP协议实现了一个简单的回声服务器&#xff0c;本节将基于TCP协议实现一个类似的回声服务器。在鸿蒙API10以后&#xff0c;提供了TCPSocke…

【C++】使用vscode进行 C/C++ 开发,内含c_cpp_properties.json、launch.json 和 tasks.json解释

在 Visual Studio Code (VSCode) 中进行 C/C 开发时&#xff0c;这三个 .json 文件&#xff08;c_cpp_properties.json、launch.json 和 tasks.json&#xff09;分别用于配置编译、调试和代码提示等功能。它们是 VSCode 配置环境的一部分&#xff0c;由 C/C 扩展生成&#xff0…

将java项目jar包打包成exe服务

1.结构展示 2.注意事项 前提: 环境准备:jdk8 和 .net支持 { 1.控制面板》程序和功能》启用和关闭windows功能》.net的勾选》2.jdk8自行百度安装环境3.其他项目必须的软件环境安装等&#xff08;数据库...&#xff09; }第一次准备: 1.将打包好的jar包放到premiumServices.exe…

智和信通助力某大型服饰集团建设综合监控运维

某大型服饰集团成立于90年代&#xff0c;是广受认可的国民生活时尚品牌&#xff0c;近年来随着集团公司业务规模的不断扩大&#xff0c;信息化作为支撑集团公司业务发展的重要技术手段&#xff0c;信息系统无论在规模上还是在复杂程度上均有了很大程度的增加。 项目现状 当前信…

计算机网络—vlan(虚拟局域网)

内容补充 冲突域 如果两台设备同时发送数据&#xff0c;他们的数据会互相干扰&#xff0c;那么他们就处于同一冲突域&#xff0c;例如集线器&#xff08;总线型&#xff0c;所有设备共享带宽&#xff09;的所有端口都处于冲突域。 广播域 如果一台设备发送数据&#xff0c;…

babylonjs shader学习之copy shadertoy案例

shadertoy案例&#xff1a; 准备 const onSceneReady (scene: Scene) > {const light new HemisphericLight(light, new Vector3(0, 1, 0), scene);light.intensity 0.7;Effect.ShadersStore[planeMatVertexShader] precision highp float;attribute vec3 position;attr…

单片机输出方波

从P1.0上输出一个方波,高电平5ms&#xff0c;低电平10ms. &#xff03;include〈reg51。h〉 unsigned char flag; sbit outP1^0&#xff1b; void main() &#xff5b; flag0&#xff1b; TMOD0X02; TH06&#xff1b; TL06; TR01&#xff1b; EA1&#xff1b; ET0…

Redis JSON介绍和命令大全

Redis JSON介绍和命令大全 Redis JSON先说说JSON是什么再说说JSON Path先推荐两个网站JSONPath JAVA clents Redis JSON 安装内存json命令语法命令url命令解释JSON.ARRAPPENDJSON.ARRINDEXJSON.ARRINSERTJSON.ARRLENJSON.ARRPOPJSON.ARRTRIMJSON.CLEARJSON.DEBUG MEMORYJSON.DE…

centOS部署Jenkins实现项目可持续自动化部署

个人看的是尚硅谷的视频&#xff0c;跟着实战&#xff0c;但因为视频是21年的&#xff0c;所以很容易出现jenkins插件不适配问题。 因而个人直接用较新版的jdk和jenkins. 先切换到root用户 sudo su一、安装jdk 先查询可安装版本 yum list java*安装jdk&#xff08;只复制圈…

【算法】归并排序概念及例题运用

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

爬虫日常实战

爬取美团新闻信息&#xff0c;此处采用两种方法实现&#xff1a; 注意点&#xff1a;因为此处的数据都是动态数据&#xff0c;所以一定要考虑好向下滑动数据包会更新的情况&#xff0c;不然就只能读取当前页即第一页数据&#xff0c;方法一通过更新ajax数据包网址页数&#xf…

vscode 预览markdown 文件

1. 点击左边扩展 2. 搜索“Markdown Preview Enhanced” 3. 选第一个安装即可 4. 重启vscode 5. 打开一个markdown 文件 6. 点击右上角的预览按钮

[mysql]mysql的全部单行函数

单行函数 几乎我们认识的语言都会对一些常用的功能进行,封装,有些叫函数,有些叫方法(Java),后期我们还可以自定义函数. 现在我们就当大家是没有语言基础,我们来从头开始讲.不过大家肯定接触过,中学说的函数,yf(x)f代表的就是function的缩写,这里其y2x1fx代表的就是封装的内容…

FileLink内外网文件交换——致力企业高效安全文件共享

随着数字化转型的推进&#xff0c;企业之间的文件交流需求日益增加。然而&#xff0c;传统的文件传输方式往往无法满足速度和安全性的双重要求。FileLink作为一款专注于跨网文件交换的工具&#xff0c;致力于为企业提供高效、安全的文件共享解决方案。 应用场景一&#xff1a;项…

C++大沥2019年真题——数字圈

Hi&#xff01;大家好&#xff01;Im#张亿&#xff0c;今天来讲C大沥2019年真题——数字圈 题目描述 当我们写数字时会发现有些数字有封闭区域&#xff0c;有的数字没有封闭区域。 数字 0 有一个封闭区域&#xff0c;数字 1、2、 3 都没有封闭区域&#xff0c;数字 4 有一个封…

word中的内容旋转90度

在vsto、Aspose.Words 中&#xff0c;默认没有直接的 API 可以让表格整体旋转 90 度。然而&#xff0c;我们可以通过一些方式来实现类似的效果&#xff0c;具体思路如下&#xff1a; 将表格插入到一个形状&#xff08;Shape&#xff09;或文本框中&#xff0c;然后旋转该形状。…

《RECONX: RECONSTRUCT ANY SCENE FROM SPARSEVIEWS WITH VIDEO DIFFUSION MODEL》论文阅读

论文地址&#xff1a;https://arxiv.org/pdf/2408.16767 项目地址&#xff1a;GitHub - liuff19/ReconX: ReconX: Reconstruct Any Scene from Sparse Views with Video Diffusion Model ---------------------------------------------------------------------------------…

2019年计算机网络408真题解析

第一题&#xff1a; 解析&#xff1a;OSI参考模型第5层完成的功能 首先&#xff0c;我们需要对OSI参考模型很熟悉&#xff1a;从下到上依次是&#xff1a;物理层-数据链路层-网络层- 运输层-会话层-表示层-应用层&#xff0c;由此可知&#xff0c;题目要问的是会话层的主要功能…

什么是感知与计算融合?

感知与计算融合&#xff08;Perception-Computing Fusion&#xff09;是指将感知技术&#xff08;如传感器、摄像头等&#xff09;与计算技术&#xff08;如数据处理、人工智能等&#xff09;有机结合&#xff0c;以实现对环境的更深层次理解和智能反应的过程。该技术广泛应用于…

基于SSM品牌银饰售卖系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;促销活动管理&#xff0c;饰品管理&#xff0c;我的收藏管理&#xff0c;系统管理&#xff0c;订单管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;…