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

C++ 模板库map数据结构的概念和使用案例

C++ std::map 概念详解

std::map 是 C++ 标准模板库(STL)中的一种关联容器,以键值对(Key-Value Pair)的形式存储元素,并根据键(Key)自动排序。其核心特性如下:

核心特性
  1. 有序性
    元素按键的升序自动排序(默认使用 std::less<Key>,可通过比较器自定义)。
  2. 唯一键
    每个键在 map必须唯一(重复插入会失败)。
  3. 底层实现
    通常基于红黑树(自平衡二叉搜索树),保证插入、删除、查找操作的时间复杂度为 O(log n)
  4. 键不可变性
    元素的键为常量(不可修改),值可修改。

基本操作与常用成员函数

操作函数示例
插入元素insert() / emplace()m.insert({"Alice", 90});
访问元素operator[] / at()m["Bob"] = 85;
查找元素find()auto it = m.find("Charlie");
删除元素erase()m.erase("Alice");
检查容器大小size() / empty()if (!m.empty()) {...}
遍历容器迭代器 / 范围循环for (const auto& p : m) {...}

使用案例:学生成绩管理系统

#include <iostream>
#include <map>
#include <string>int main() {// 创建map:键=学生姓名(string), 值=分数(int)std::map<std::string, int> scores;// 插入数据(3种方式)scores["Alice"] = 90;                  // 使用 operator[]scores.insert({"Bob", 85});             // 使用 insert + 初始化列表scores.emplace("Charlie", 95);          // 使用 emplace(直接构造)// 尝试插入重复键(失败)auto ret = scores.insert({"Alice", 100});if (!ret.second) {std::cout << "Insert failed: Alice already exists.\n";}// 更新分数(通过键直接修改值)scores["Bob"] = 88;  // Bob的分数更新为88// 安全访问(避免意外插入新键)std::cout << "Charlie's score: "<< (scores.find("Charlie") != scores.end() ? scores.at("Charlie") : -1)<< "\n";// 删除学生scores.erase("Alice");// 遍历并打印所有学生成绩(自动按姓名升序排序)std::cout << "\nCurrent Scores:\n";for (const auto& [name, score] : scores) {  // C++17结构化绑定std::cout << name << ": " << score << "\n";}// 检查是否存在键std::string target = "David";if (scores.count(target)) {std::cout << target << " found.\n";} else {std::cout << target << " not found.\n";}return 0;
}
输出结果:
Insert failed: Alice already exists.
Charlie's score: 95Current Scores:
Bob: 88
Charlie: 95
David not found.

关键注意事项

  1. 避免 operator[] 的副作用
    使用 map[key] 访问不存在的键时,会自动插入该键(值初始化为0)。推荐先用 find()count() 检查键是否存在。
  2. 自定义排序规则
    可通过传递比较器实现降序排序:
    std::map<std::string, int, std::greater<>> scores; // 按键降序
    
  3. 性能考量
    • 适合需要有序遍历的场景。
    • 若只需检查键是否存在且不要求顺序,可用 std::unordered_map(哈希表实现,O(1) 平均复杂度)。

应用场景

  • 字典/配置文件解析(键值映射)
  • 缓存机制(如LRU Cache,需结合链表)
  • 需要有序键值对的任何场景
http://www.xdnf.cn/news/16186.html

相关文章:

  • 板凳-------Mysql cookbook学习 (十二--------5)
  • 鸿蒙卡片开发保姆级教程
  • Java 线程池详解:从原理到实战,彻底掌握并发编程核心组件
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现水下鱼类识别(C#代码,UI界面版)
  • 【机器学习深度学习】微调量化与模型导出量化:区分与应用
  • 数字护网:一次深刻的企业安全体系灵魂演练
  • JavaScript 03 严格检查模式Strict字符串类型详解
  • 论文笔记 | Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes
  • Python机器学习:从零基础到项目实战
  • Netty中AbstractReferenceCountedByteBuf对AtomicIntegerFieldUpdater的使用
  • GRU模型
  • Linux操作系统之线程(六):线程互斥
  • SpringMVC快速入门之核心配置详解
  • 第十二章 用Java实现JVM之结束
  • 网络基础15-16:MSTP +VRRP综合实验
  • linux 环境服务发生文件句柄泄漏导致服务不可用
  • 基于网络爬虫的在线医疗咨询数据爬取与医疗服务分析系统,技术采用django+朴素贝叶斯算法+boostrap+echart可视化
  • CS231n-2017 Lecture5卷积神经网络笔记
  • 【世纪龙科技】电动汽车原理与构造-汽车专业数字课程资源
  • 33、基于JDK17的GC调优策略
  • haproxy七层均衡
  • CanOpen--SDO 数据帧分析
  • Hugging Face 模型的缓存和直接下载有什么区别?
  • 【C++】第十八节—一文万字详解 | map和set的使用
  • 7.22 Java基础 | I/O流【下】
  • 小米视觉算法面试30问全景精解
  • HCIA/IP(一二章)笔记
  • Redis 初识
  • vcs门级仿真(后仿真)指南
  • Linux研学-Tomcat安装