map容器用法
时间: 2025-06-27 12:13:35 浏览: 9
### C++ 中 `std::map` 的基本概念
`std::map` 是 C++ STL 提供的一种关联容器,它存储的是键值对 (key-value pair),并按照键的顺序自动排列。其底层实现通常基于红黑树(一种自平衡二叉查找树),因此提供了高效的插入、删除和查找操作[^1]。
#### 基本特性
- 键具有唯一性,不允许重复。
- 自动按升序或降序排列键。
- 插入、删除和查找的时间复杂度均为 O(log n)[^2]。
---
### 创建与初始化
可以通过多种方式创建和初始化一个 `std::map`:
```cpp
#include <iostream>
#include <map>
int main() {
std::map<int, std::string> myMap; // 默认构造函数
// 初始化列表
std::map<std::string, int> anotherMap = {{"Alice", 25}, {"Bob", 30}};
return 0;
}
```
上述代码展示了如何通过默认构造函数以及初始化列表来定义 `std::map`[^3]。
---
### 插入数据
可以使用以下几种方法向 `std::map` 中插入元素:
```cpp
myMap[1] = "One"; // 方括号运算符会自动插入新键值对
myMap.insert({2, "Two"}); // 使用 insert 方法显式插入
auto result = myMap.emplace(3, "Three"); // emplace 更高效,适用于 C++11 及以上版本
```
每种方法都有不同的适用场景,其中方括号运算符会在找不到对应键时自动创建一个新的键值对,并将其值设为类型的默认值[^4]。
---
### 访问数据
访问 `std::map` 中的数据主要依赖于下标运算符 (`operator[]`) 或成员函数 `at()`:
```cpp
std::cout << myMap[1] << std::endl; // 输出 "One"
try {
std::cout << myMap.at(4) << std::endl; // 如果不存在该键,则抛出异常
} catch(const std::out_of_range& e){
std::cerr << "Key not found!" << std::endl;
}
```
注意:`operator[]` 在未找到指定键的情况下会插入一条新的记录;而 `at()` 则不会修改原容器,在键不存在时抛出异常[^5]。
---
### 遍历容器
遍历整个 `std::map` 容器可采用迭代器或者范围循环的方式完成:
```cpp
for(auto const &pair : myMap){
std::cout << "{" << pair.first << ", " << pair.second << "}\n";
}
// 迭代器方式
for(std::map<int,std::string>::iterator it=myMap.begin();it!=myMap.end();++it){
std::cout << "{" << (*it).first << ", " << (*it).second << "}\n";
}
```
这两种形式均能有效枚举所有的键值对[^6]。
---
### 删除元素
支持单个元素移除及清空全部内容两种模式:
```cpp
myMap.erase(1); // 移除键为 1 的条目
myMap.clear(); // 清空所有元素
```
调用 `erase` 函数可以根据具体需求精确控制哪些项被清除[^7]。
---
### 性能分析
由于内部采用了平衡二叉搜索树作为基础架构,所以对于大小为 N 的映射表而言,执行一次查询、更新或是销毁的操作所需时间大致相当于 log(N)[^8]。
---
阅读全文
相关推荐


















