c++ map
时间: 2025-04-25 13:34:46 浏览: 28
### C++ STL `map` 容器的用法
#### 创建和初始化 `map`
`std::map` 是关联容器,存储键值对并自动按键排序。创建一个简单的整数到字符串映射:
```cpp
#include <iostream>
#include <map>
int main() {
std::map<int, std::string> myMap;
// 插入元素
myMap.insert(std::make_pair(1, "one"));
myMap.emplace(2, "two");
myMap[3] = "three";
}
```
上述代码展示了三种不同的插入方法[^2]。
#### 遍历 `map`
遍历整个 `map` 并打印所有条目可以如下实现:
```cpp
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << '\n';
}
```
这段代码利用基于范围的循环来访问每一个键值对。
#### 查找特定项
为了查找是否存在某个键以及获取对应的值,可使用成员函数 `find()` 或者运算符[]:
```cpp
auto search = myMap.find(key);
if (search != myMap.end()) {
// 找到了该key
} else {
// key不存在
}
// 使用operator[]
std::string value = myMap[key]; // 如果key存在则返回对应value;如果不存在,则会默认构造一个新的entry
```
需要注意的是,当使用下标操作符时,若指定的键不在表内将会被插入,并赋予一个由类型决定的初始值[^3]。
#### 删除元素
删除单个元素可以通过提供迭代器给 erase 函数完成,也可以通过指定要移除的关键字来进行批量清除:
```cpp
myMap.erase(search); // 移除找到的第一个匹配项
myMap.erase(someKey); // 移除具有someKey作为关键字的所有项目
```
另外,在遍历时安全地移除满足条件的对象需小心处理迭代器失效问题:
```cpp
for (auto it = myMap.begin(); it != myMap.end(); ) {
if (it->first == someCondition) {
it = myMap.erase(it); // 返回下一个有效的迭代位置
} else {
++it;
}
}
```
此段代码片段展示了一个安全的方式去遍历并有条件地移除元素而不引起迭代器失效错误。
#### 自定义比较器
除了内置类型的键外,还可以为复杂的数据结构设置自定义比较逻辑以便正确排序。例如反转顺序排列整数值:
```cpp
std::map<int, double, std::greater<int>> reversedIntDoubleMap;
reversedIntDoubleMap[1] = 98.6;
reversedIntDoubleMap[2] = 75.4;
```
这里指定了第三个模板参数 `std::greater<int>` 来改变默认升序行为。
阅读全文
相关推荐














