当前位置: 首页 > 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.lryc.cn/news/595926.html

相关文章:

  • React集成百度【BMap Draw】教程(001):实现距离测量和面积测量
  • Go后端配置文件教程
  • Python 链接各种中间件[Mysql\redis\mssql\tdengine]
  • 发票识别技术原理
  • Redis持久化-AOF
  • Ubuntu 桌面版和服务器版在资源消耗上的对比分析
  • 第十六天(结构体初学)
  • Sa-Token大师:第四章 - 企业级架构与源码实战
  • Events
  • Linux部署.net Core 环境
  • 虚幻 5 与 3D 软件的协作:实时渲染,所见所得
  • linux-日志服务
  • 同步本地文件到服务器上的Docker容器
  • 跨维智能:全新一代人形机器人 DexForce W1 Pro
  • 大模型后训练——DPO实践
  • Mosaic数据增强介绍
  • 使用ubuntu:20.04和ubuntu:jammy构建secretflow环境
  • android模拟器手机打开本地网页
  • Tailwind CSS快速上手 Tailwind CSS的安装、配置、使用
  • J2EE模式---拦截过滤器模式
  • Vite:下一代前端构建工具的革命
  • C语言---VSCODE的C语言环境搭建
  • RISC-V基金会Datacenter SIG月会圆满举办,探讨RAS、PMU性能分析实践和经验
  • vs2017 c++ 使用sqlite3数据库
  • 末日期权的双买和单买策略区别是什么?
  • 双向链表详解及实现
  • C++_Hello算法_队列
  • 基于Java+MySQL实现(Web)文件共享管理系统(仿照百度文库)
  • 188粉福
  • Spring快速整合Mybatis