C++std::map
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提供的丰富接口,可高效实现复杂数据管理需求。