一、什么是 map?
map 是 C++ 标准库中的关联式容器,用于存储 键值对(Key-Value) ,底层基于 红黑树 实现。其核心特性包括:
-
键唯一性:每个键(Key)在容器中唯一,不可重复。
-
自动排序:键值对按键的升序排列。
-
高效查找 :插入、删除、查找的时间复杂度为 O(logN) 。
cpp#include <map> std::map<std::string, int> ageMap; ageMap["Alice"] = 25; ageMap["Bob"] = 30;二、基本操作与示例
1. 插入元素
-
insert:支持插入单个元素或范围。 -
直接赋
cppstd::map<int, std::string> m; m.insert({1, "Apple"}); // 插入单个元素 m.insert({{2, "Banana"}, {3, "Cherry"}}); // 插入多个元素 m[4] = "Date"; // 使用下标插入值 :通过
[]操作符直接赋值(若键不存在则自动创建)。
2. 查找元素
-
find:返回指向键的迭代器,若未找到则返回end()。 -
count:判断键是否存在(返回 0 或 1)。cppauto it = m.find(2); if (it != m.end()) { std::cout << it->second; // 输出 "Banana" }3. 删除元素
-
erase:支持按键删除或按迭代器删除
cpp
m.erase(2); // 删除键为 2 的元素
m.erase(it); // 删除迭代器指向的元素
三、进阶用法
1. 自定义键类型
默认使用 less<Key> 进行键比较,若需自定义排序规则,可通过仿函数或 operator< 实现。
cpp
struct Person {
std::string name;
int age;
bool operator<(const Person& p) const {
return age < p.age; // 按年龄排序
}
};
std::map<Person, std::string> customMap;
2. 高效插入(C++17+)
-
try_emplace:避免不必要的临时对象构造。cppstd::map<std::string, std::string> m; m.try_emplace("key", "value"); // 类似 insert,但更高效3. 内存优化技巧
-
预分配策略:对于有序数据,提前排序后批量插入可减少红黑树旋转开销。
-
节点转移 :使用
extract()在容器间转移节点。
cpp
auto node = m.extract("key"); // 提取节点
node.key() = "new_key"; // 修改键(需保证新键不冲突)
m.insert(std::move(node)); // 插入回容器
常见问题
- 键不可修改:键的值在插入后不可更改(否则破坏红黑树结构)。
- 避免重复键 :插入重复键时,
insert会失败,但[]会覆盖旧值。 - 并发安全 :多线程环境下需自行加锁(
map非线程安全)。