c++map容器
时间: 2025-05-11 16:27:01 浏览: 16
### C++ `map` 容器的使用方法与示例
#### 1. 基本概念
`std::map` 是 C++ 标准模板库中的一个关联容器,它通过键值对的方式存储数据,并保持按键的有序性。每个键都唯一存在,不允许重复。`std::map` 的底层实现通常基于红黑树,因此其插入、删除和查找操作的时间复杂度均为 O(log n)[^1]。
#### 2. 构造方式
可以通过多种方式进行 `std::map` 的初始化:
- **默认构造**
```cpp
#include <iostream>
#include <map>
int main() {
std::map<int, std::string> myMap;
}
```
- **列表初始化 (C++11 及以上版本支持)**
```cpp
std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}};
```
- **拷贝构造**
```cpp
std::map<int, std::string> anotherMap(myMap);
```
#### 3. 插入元素
`std::map` 提供了多种插入元素的方法:
- **使用 `insert()` 方法**
```cpp
myMap.insert(std::make_pair(3, "three"));
// 或者
myMap.insert({4, "four"});
```
- **使用下标运算符(数组方法)**
```cpp
myMap[5] = "five";
```
- **使用 `emplace()` 方法 (C++11 及以后)**
此方法直接在容器内部构建对象,避免额外的复制开销。
```cpp
myMap.emplace(6, "six");
```
#### 4. 遍历 `map`
可以使用迭代器来遍历 `std::map` 中的所有键值对:
- **正向遍历**
```cpp
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << "\n";
}
```
- **反向遍历**
```cpp
for (auto it = myMap.rbegin(); it != myMap.rend(); ++it) {
std::cout << it->first << ": " << it->second << "\n";
}
```
#### 5. 查找元素
提供了几种不同的查找机制:
- **使用 `find()` 函数**
```cpp
auto it = myMap.find(3);
if (it != myMap.end()) {
std::cout << "Found: " << it->second << "\n";
} else {
std::cout << "Not found\n";
}
```
- **使用 `count()` 函数**
```cpp
if (myMap.count(3)) {
std::cout << "Key exists.\n";
} else {
std::cout << "Key does not exist.\n";
}
```
#### 6. 删除元素
有三种主要的方式来删除元素:
- **按键删除**
```cpp
myMap.erase(3); // 删除键为3的元素
```
- **按迭代器删除**
```cpp
auto it = myMap.find(4);
if (it != myMap.end()) {
myMap.erase(it);
}
```
- **删除指定范围内的元素**
```cpp
myMap.erase(myMap.begin(), myMap.upper_bound(5));
```
#### 7. 排序特性
由于 `std::map` 底层采用的是平衡二叉搜索树结构,默认情况下会按照键的升序排列[^3]。如果需要自定义排序规则,则可以在创建 `std::map` 时提供比较函数或仿函数作为第三个参数:
```cpp
struct GreaterCompare {
bool operator()(const int lhs, const int rhs) const {
return lhs > rhs; // 自定义降序排序
}
};
std::map<int, std::string, GreaterCompare> customMap = {{10, "ten"}, {1, "one"}};
```
---
### 示例程序
下面是一个完整的例子,展示了如何综合运用上述功能:
```cpp
#include <iostream>
#include <map>
int main() {
// 初始化 map
std::map<std::string, int> wordCount;
// 插入元素
wordCount["apple"] = 1;
wordCount["banana"] = 2;
wordCount.emplace("cherry", 3);
// 遍历并打印
for (const auto& pair : wordCount) {
std::cout << pair.first << ": " << pair.second << "\n";
}
// 查找元素
auto it = wordCount.find("banana");
if (it != wordCount.end()) {
std::cout << "Found 'banana': " << it->second << "\n";
} else {
std::cout << "'banana' not found.\n";
}
// 删除元素
wordCount.erase("apple");
return 0;
}
```
---
阅读全文
相关推荐














