当前位置: 首页 > news >正文

「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.mrgr.cn/news/56936.html

相关文章:

  • IT运维的365天--017 如何在两台Linux服务器之间快速批量传输文件夹(同时设置免密)
  • 组件通信八种方式(vue3)
  • Mapbox GL 加载GeoServer底图服务器的WMS source
  • SAP依靠 “增压 “Joule加速ERP迁移
  • JVM是什么,与Java的关系是什么,以及JVM怎么实现的跨平台性
  • 机器学习1
  • 什么是机器人流量?如何识别和预防有害机器人流量?
  • 预售即断货!西圣H1头戴式耳机好评如潮,99%满意度引爆市场!
  • 『完整代码』坐骑召唤
  • 如何让别人喜欢你的代码
  • 视觉分析在烟火检测中的应用
  • 光谱共焦位移传感器的应用方案组成及测量领域
  • 功能自动化测试工具Appium使用步骤讲解
  • 【uniapp使用内置组件barcode遇到的问题】
  • 2024最新版鸿蒙纯血原生应用开发教程文档丨HarmonyOS 开发准备-成为华为开发者
  • 全面解读商用条码扫描器通信方式
  • 跨域问题曲折探索背后的一个小小的插曲:header is present on the requested resource错误
  • 自动化抖音点赞取消脚本批量处理
  • 精选10款超实用Revit插件,让你工作效率翻倍!
  • AGI第三级,智能体需要一个新的身份认证技术
  • 【KEIL那些事 4】CMSIS缺失!!!!导致不能编译!!!!软件自带芯片下载缓慢!!!!!!快速下载芯片包!!!!!
  • JavaSE——IO流6:高级流(字节打印流PrintStream、字符打印流PrintWriter)
  • 听泉鉴宝在三个月前已布局商标注册!
  • 国内有什么知名的RPA厂商?
  • Java Springboot项目线上shell文件
  • Python 快速提取PowerPoint文档中的图片