1. 概述
- 定义:std::map 是C++标准模板库(STL)中的关联容器,以键值对(key-value pairs)形式存储元素,支持快速查找和有序访问。
- 头文件:#include - 底层实现:通常基于红黑树(平衡二叉搜索树),保证元素有序性和操作高效性。
2. 核心特性
3. 基本用法
声明与初始化
std::map<KeyType, ValueType> myMap; // 默认升序
std::map<KeyType, ValueType, Compare> customMap; // 自定义排序规则
插入元素
// 方法1:通过下标操作符(若键存在,覆盖值)
myMap["Alice"] = 30;
// 方法2:insert() 插入键值对
myMap.insert(std::pair<std::string, int>("Bob", 25));
// 方法3:emplace() 直接构造元素(C++11起)
myMap.emplace("Charlie", 35);
访问元素
// 通过键访问(若键不存在,自动插入默认值)
int age = myMap["Alice"];
// 安全访问:find() 检查键是否存在
auto it = myMap.find("David");
if (it != myMap.end()) {
int age = it->second; // 存在时访问值
}
遍历元素
// 使用迭代器
for (auto it = myMap.begin(); it != myMap.end(); ++it) {
std::cout << it->first << ": " << it->second << std::endl;
}
// 使用范围for循环(C++11起)
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
### 4. 代码示例
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<std::string, int> employees;
// 插入元素
employees["Alice"] = 30;
employees.emplace("Bob", 25);
employees.insert({"Charlie", 35});
// 遍历打印
for (const auto& emp : employees) {
std::cout << emp.first << " is " << emp.second << " years old.\n";
}
return 0;
}
输出:
Alice is 30 years old.
Bob is 25 years old.
Charlie is 35 years old.
### 5. 进阶操作
自定义排序规则
// 定义比较函数(此处实现降序)
struct CompareDesc {
bool operator()(const std::string& a, const std::string& b) const {
return a > b;
}
};
int main() {
std::map<std::string, int, CompareDesc> myMap;
myMap["Alice"] = 30;
myMap["Bob"] = 25;
// 输出顺序:Charlie → Bob → Alice
}
6. 注意事项
- 键的唯一性:若需允许重复键,使用std::multimap。
- 自动插入风险:operator[]会在键不存在时插入默认值,优先使用find()检查存在性。
- 自定义比较函数:需严格遵循严格弱序(strict weak ordering)规则。
- 性能权衡:虽然查找高效,但内存开销高于无序容器(如std::unordered_map)。
7. 总结
std::map 是处理有序键值对数据的理想选择,适用于需要按键排序和快速查找的场景。结合其特性与STL提供的丰富接口,可高效实现复杂数据管理需求。