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

std::map的基本用法

std::map 是标准模板库(STL)提供的关联容器,底层基于红黑树实现,存储的是键值对(key-value),并按照键的升序自动排序。由于其有序性,std::map 适合需要按键排序或范围查询的场景。

一、头文件与命名空间

使用 std::map 需包含头文件 ,并位于 std 命名空间中:

#include <map>
using namespace std; // 或显式使用 std::map

二、基本定义与初始化

std::map 是模板类,需指定键类型(Key) 和值类型(Value)。

2.1 定义方式

// 定义一个键为 int、值为 string 的 map(默认按 key 升序)
map<int, string> myMap;// 定义时初始化(C++11 及以上)
map<int, string> myMap = {{1, "apple"}, {2, "banana"}, {3, "cherry"}};

2.2 键的特性

  • 键(Key)必须可比较(需支持 < 运算符,或自定义比较器)。
  • 键唯一,若插入重复键,会覆盖原有值(或忽略,取决于插入方式)。

三、核心接口函数

3.1 插入键值对 ( insert / operator[] )

  • operator[]:最常用,若键不存在则插入,存在则更新值。
  • insert:插入键值对,若键已存在则不更新,返回插入结果。
// 1. 使用 operator[] 插入/更新
myMap[1] = "apple";   // 插入 {1, "apple"}
myMap[2] = "banana";  // 插入 {2, "banana"}
myMap[1] = "apricot"; // 更新键 1 的值为 "apricot"// 2. 使用 insert 插入(返回 pair<迭代器, bool>,bool 表示是否插入成功)
auto res = myMap.insert({3, "cherry"}); 
if (res.second) {cout << "插入成功" << endl; // 键 3 不存在,插入成功
} else {cout << "键已存在" << endl; // 键 3 已存在,不更新
}// 3. 插入范围(从其他 map 或容器)
map<int, string> otherMap = {{4, "date"}, {5, "elderberry"}};
myMap.insert(otherMap.begin(), otherMap.end()); // 插入 otherMap 的所有键值对

3.2 查找键(find / count)

  • find(key):返回指向键值对的迭代器,若键不存在则返回 end()。
  • count(key):返回键的出现次数(0 或 1,因键唯一),用于判断键是否存在。
// 1. 使用 find 查找
auto it = myMap.find(2);
if (it != myMap.end()) {cout << "找到键 2,值为:" << it->second << endl; // it->first 是键,it->second 是值
} else {cout << "未找到键 2" << endl;
}// 2. 使用 count 判断存在性
if (myMap.count(3)) {cout << "键 3 存在" << endl;
} else {cout << "键 3 不存在" << endl;
}

3.3 删除键值对(erase)

  • 支持按键、迭代器或范围删除,返回删除的元素个数(按键删除时)。
// 1. 按键删除(返回删除的个数,0 或 1)
size_t deleted = myMap.erase(2); 
cout << "删除了 " << deleted << " 个元素" << endl;// 2. 按迭代器删除(返回下一个迭代器)
auto it = myMap.find(3);
if (it != myMap.end()) 
{it = myMap.erase(it); // 删除后迭代器指向 next 元素
}// 3. 范围删除(删除 [begin, end) 之间的元素)
myMap.erase(myMap.begin(), myMap.end()); // 清空 map(等价于 clear())

3.4 清空与大小(clear / size / empty)

  • clear():删除所有键值对,size() 变为 0。
  • size():返回当前键值对的数量。
  • empty():判断 map 是否为空(size() == 0 时返回 true)。
cout << "当前大小:" << myMap.size() << endl;if (myMap.empty()) 
{cout << "map 为空" << endl;
} 
else 
{myMap.clear(); // 清空cout << "清空后大小:" << myMap.size() << endl;
}

3.5 遍历(迭代器 / 范围 for 循环)

  • 由于 std::map 有序,遍历结果按键升序排列。
// 1. 迭代器遍历
for (map<int, string>::iterator it = myMap.begin(); it != myMap.end(); ++it) 
{cout << it->first << ": " << it->second << endl;
}// 2. 范围 for 循环(C++11 及以上)
for (const auto& pair : myMap) 
{ // pair 是 const pair<int, string>&cout << pair.first << ": " << pair.second << endl;
}
http://www.wxhsa.cn/company.asp?id=657

相关文章:

  • 力扣20题 有效的括号
  • 2025年9月10日学习笔记之keil软件仿真调试
  • MySQL的explain使用
  • 力扣19题 删除链表的倒数第N个结点
  • 基于LZO的无损数据压缩IP,高性能压缩速率32Gbps,适用于FPGAASIC
  • IDEA创建文件时如何自动生成头部文档注释(简单、实用)
  • 一文带你吃透Power Platform,开启低代码开发新世界
  • docker compose 启动 redis 服务
  • MBR引导的OS Bootloader遇到被bios无视引导(自动重启)的解决办法
  • #java作业
  • 【Qt6】qt6下载地址
  • QOJ1838 Intellectual Implementation 题解
  • OpenSSH漏洞修复
  • 力扣15题三数之和
  • some plan
  • 利用废弃硬件中的零日漏洞:从Netgear路由器到BitDefender盒子的攻击链分析
  • ECT-OS-JiuHuaShan框架:自然规律的具象化智能体(附《易经》类比解析)
  • 力扣第5题最长回文子串
  • 用 Python 和 PaddleOCR 进行验证码识别
  • TASK 1 训练一个网络识别手写数字
  • 复杂背景验证码的识别思路与图像处理方法
  • Symfony学习笔记 - The Symfony Framework Best Practices
  • 大学军训
  • Vue Day3【综合案例2】vue小兔鲜儿
  • Java 基础知识解析
  • 力扣第3题 无重复字符的最长子串
  • UniApp 自定义导航栏
  • P3177 [HAOI2015] 树上染色
  • UniApp 自定义tabBar
  • NOIP2024复盘