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

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.dtcms.com/a/293272.html

相关文章:

  • Rabbit安装
  • vben ruoyi 数据字典解决方案
  • 16.多生成树MSTP
  • Linux文件系统理解1
  • Selenium+Java 自动化测试入门到实践:从环境搭建到元素操作
  • ubuntu22.04 录视屏软件推荐
  • Three.js 实现梦幻星河流光粒子特效原理与实践
  • Redis 5.0中的 Stream是什么?
  • C语言(20250722)
  • 21. `taskSlotTable`和`jobLeaderService`启动
  • 使用空间数据训练机器学习模型的实用工作流程
  • An error occurred at line: 1 in the generated java file问题处理及tomcat指定对应的jdk运行
  • Dify工作流:爬虫文章到AI知识库
  • 【OD机试】数组和最大
  • Java基础环境配置
  • 从零开始学习大模型之文本数据处理
  • BEV-LaneDet
  • 网络编程---网络基础知识
  • 【文本分析】使用LDA模型进行主题建模——李牧南等(2024)《科研管理》、马鸿佳等(2025)《南开管理评论》的复现
  • 24. 两两交换链表中的节点
  • 线程池excutor 和 submit区别 关于异常处理,请详细说明,会吞掉异常吗,需要捕获吗
  • vue3:十八、内容管理-实现行内图片的预览、审核功能
  • Python--numpy基础知识
  • 海洋大地测量基准与水下导航系列之九我国海洋PNT最新技术进展(中)
  • Qt开发环境搭建全攻略(Windows+Linux+macOS)
  • 14.8 LLaMA2-7B×Dolly-15K实战:从准确率63%到89%,如何用优质数据让大模型性能飙升42%?
  • 17-VRRP
  • 汉诺塔问题
  • 阿里Seata事务模式场景化选型指南
  • Java学习-------事务失效