#1024程序员节 | 征文# 
往期回顾:
C++ 入门14:STL 容器之向量(vector)-优快云博客
C++ 入门17:STL 容器之映射(map)与多重映射(multimap)
一、前言
在前面文章的学习中,我们学习了 STL 中的 vector、list 等容器。这些容器主要用于存储线性数据,但有时候我们需要存储键值对(key-value pair),这种场景下就需要使用映射(map)容器。今天我们将学习 C++ 标准模板库(STL)中的 map 和 multimap,它们都可以用来存储键值对,记住最重要的区别: map 不允许键重复,而 multimap 允许键重复。
1. 什么是映射(map)
在 C++ 标准模板库(STL)中,map 是一种关联式容器,用于存储键值对(key-value pairs)。每个 map 元素都由两个部分构成:键(key)和值(value)。键用于唯一标识元素,而值则与键相关联,可以是任何类型的数据。map 的主要特点是其内部元素按键的顺序进行排序,默认情况下是按照键的升序排列,但也可以通过提供自定义的比较函数来改变排序规则。
- 键:用于标识元素的唯一标识符。
- 值:与键相关联的数据。
1.1基本特性
- 键是唯一的,不允许重复。
- 键值对按照键的顺序存储(默认按升序排序)。
- 可以通过键快速查找对应的值。
2. 映射的基本操作
2.1引入头文件
在使用 map 之前,需要引入头文件 <map>。
#include <map>
2.2创建映射
我们可以使用不同的方式来创建 map。
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, string> studentMap; // 创建一个空的映射,键为 int,值为 string
// 初始化映射
studentMap[101] = "Alice";
studentMap[102] = "Bob";
studentMap[103] = "Charlie";
// 另一种初始化方式
map<int, string> studentMap2 = {{201, "David"}, {202, "Eve"}};
return 0;
}
2.3常用成员函数
2.3.1插入元素
可以使用下标运算符 [] 或者 insert 函数来插入键值对。
示例:
map<int, string> studentMap;
studentMap[101] = "Alice"; // 使用下标运算符插入
studentMap.insert(make_pair(102, "Bob")); // 使用 insert 函数插入
2.3.2访问元素
通过键来访问映射中的值。如果键不存在,使用 [] 会插入该键并初始化默认值,而使用 at 则会抛出异常。
示例:
cout << "Student with ID 101: " << studentMap[101] << endl; // 使用 []
cout << "Student with ID 102: " << studentMap.at(102) << endl; // 使用 at
2.3.3删除元素
可以使用 erase 函数删除指定键的元素。
示例:
studentMap.erase(101); // 删除键为 101 的元素
2.3.4获取大小与检查空
- 使用
size函数获取映射中的元素个数。 - 使用
empty函数检查映射是否为空。
示例:
cout << "Size of map: " << studentMap.size() << endl;
if (studentMap.empty()) {
cout << "Map is empty" << endl;
}
2.3.5查找元素
使用 find 函数可以查找某个键是否存在,返回迭代器指向该元素,若不存在,则返回 end()。
示例:
auto it = studentMap.find(102); // 查找键为 102 的元素
if (it != studentMap.end()) {
cout << "Found student with ID 102: " << it->second << endl;
} else {
cout << "Student with ID 102 not found" << endl;
}
3. 多重映射(multimap)
multimap 是 C++ STL 中的另一种关联式容器,与 map 类似,但允许多个具有相同键的键值对存在。这意味着在同一个 multimap 中,可以插入多个键相同的元素,每个元素可以有不同的值。
3.1引入头文件
在使用 multimap 之前,需要引入头文件 <map>(map 头文件中同时包含了 multimap)。
#include <map>
3.2创建多重映射
multimap 的使用方式与 map 基本相同,只是插入时允许重复的键。
示例:
#include <iostream>
#include <map>
using namespace std;
int main() {
multimap<int, string> multiStudentMap;
// 插入多个具有相同键的元素
multiStudentMap.insert(make_pair(101, "Alice"));
multiStudentMap.insert(make_pair(101, "Bob"));
multiStudentMap.insert(make_pair(102, "Charlie"));
// 遍历多重映射
for (const auto& pair : multiStudentMap) {
cout << "ID: " << pair.first << ", Name: " << pair.second << endl;
}
return 0;
}
3.3查找元素
multimap 中,使用 find 函数只能找到键对应的第一个元素。如果要查找所有具有相同键的元素,可以使用 equal_range 函数。
示例:
auto range = multiStudentMap.equal_range(101);
for (auto it = range.first; it != range.second; ++it) {
cout << "ID: " << it->first << ", Name: " << it->second << endl;
}
4. map 与 multimap 的区别
| 特性 | map | multimap |
|---|---|---|
| 键是否唯一 | 唯一 | 可以重复 |
| 插入操作 | 如果键已存在,无法插入 | 可以插入重复键 |
| 查找操作 | 返回一个键对应的值 | 返回多个键对应的值 |
5. 映射的高级操作
5.1自定义排序规则
默认情况下,map 和 multimap 是按键的升序排序的。如果需要自定义排序规则,可以通过传递比较函数实现。
示例:
struct Descending {
bool operator()(const int& a, const int& b) const {
return a > b; // 降序排序
}
};
map<int, string, Descending> studentMap; // 使用自定义降序排序规则
studentMap[101] = "Alice";
studentMap[102] = "Bob";
studentMap[103] = "Charlie";
5.2合并两个映射
可以使用 insert 函数将一个映射中的所有元素插入到另一个映射中。
示例:
map<int, string> map1 = {{101, "Alice"}, {102, "Bob"}};
map<int, string> map2 = {{103, "Charlie"}, {104, "David"}};
map1.insert(map2.begin(), map2.end());
for (const auto& pair : map1) {
cout << "ID: " << pair.first << ", Name: " << pair.second << endl;
}
以上就是 C++ 标准模板库中的 映射(map)与多重映射(multimap)的基础知识点了。它们都是用来存储键值对的关联容器。map 不允许重复键,而 multimap 允许多个相同的键。无论是处理需要排序的元素集合,还是需要统计重复数据的场景,都可以帮助我们更高效地处理关联数据。基本上在开发中都会用到的,大家多看看,一定要掌握。
都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!
3817

被折叠的 条评论
为什么被折叠?



