std::map 是标准模板库(STL)提供的关联容器,底层基于红黑树实现,存储的是键值对(key-value),并按照键的升序自动排序。由于其有序性,std::map 适合需要按键排序或范围查询的场景。
一、头文件与命名空间
使用 std::map 需包含头文件
#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;
}