C++的multimap
时间: 2025-03-18 07:10:45 浏览: 28
### C++ `multimap` 的使用方法及特性
#### 1. 基本概念
`multimap` 是 C++ STL 提供的一种关联容器,类似于 `map`,但它允许存储多个具有相同键的值。它的定义如下[^4]:
```cpp
template <class Key, class T, class Pred = less<Key>, class A = allocator<T> >
class multimap {
...
};
```
其中:
- **Key**: 键的数据类型。
- **T**: 映射到的值的数据类型。
- **Pred**: 排序准则,默认为 `less<Key>`,即按键升序排列。
- **A**: 分配器类型。
#### 2. 构造函数
可以通过多种方式创建一个 `multimap` 实例。以下是常见的构造形式[^3]:
```cpp
// 创建空的 multimap
std::multimap<int, std::string> mmap;
// 初始化列表构建 multimap
std::multimap<char, int> mmap = { {'a', 1}, {'b', 2}, {'b', 3} };
```
#### 3. 插入元素
通过成员函数 `.insert()` 可以向 `multimap` 添加新元素。支持单个插入和范围插入[^1]:
```cpp
mymultimap.insert({ 'c', 4 });
mymultimap.insert(std::make_pair('d', 5));
```
#### 4. 访问元素
由于 `multimap` 支持重复键,无法像 `map` 那样直接通过下标访问某个特定键对应的唯一值。可以使用迭代器来遍历所有匹配项:
```cpp
for (auto it = mymultimap.lower_bound('b'); it != mymultimap.upper_bound('b'); ++it) {
std::cout << it->first << ": " << it->second << "\n";
}
```
#### 5. 删除元素
删除操作可通过指定键名或者迭代器完成。注意,如果存在多条记录对应同一键,则会全部被移除:
```cpp
size_t count_removed = mymultimap.erase('b');
std::cout << count_removed << " elements removed.\n";
// 清空整个 multimap
mymultimap.clear();
```
#### 6. 自定义排序
默认情况下,`multimap` 按照键从小到大顺序存储数据。然而,也可以提供自定义比较逻辑实现不同的排序策略[^2]:
```cpp
struct CompareSecond {
bool operator()(const std::pair<int, std::string>& lhs,
const std::pair<int, std::string>& rhs) const {
return lhs.second < rhs.second;
}
};
std::multimap<int, std::string, CompareSecond> customMMap = {{2, "two"}, {1, "one"}};
```
#### 7. 示例代码
下面给出一段完整的例子展示如何初始化、插入、查询以及清理一个多映射表实例[^1]:
```cpp
#include <iostream>
#include <map>
using namespace std;
int main(){
// Initialize with some values
multimap<char,int> mmi={{'a',1},{'b',2},{'b',3}};
// Insert new pairs into the multimap
mmi.emplace('c',4);
mmi.insert({'d',5});
// Iterate over all items and print them out.
for(auto& p : mmi){
cout<<p.first<<" -> "<<p.second<<"\n";
}
// Find how many entries exist under key 'b'
auto range=mmi.equal_range('b');
cout<<"\nEntries found for 'b':\n";
while(range.first!=range.second){
cout<<(*range.first).second<<"\n";
++range.first;
}
// Clear contents of the container
mmi.clear();
return 0;
}
```
---
###
阅读全文
相关推荐


















