#1024程序员节 | 征文#
往期回顾:
C++ 入门14:STL 容器之向量(vector)-CSDN博客
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
允许多个相同的键。无论是处理需要排序的元素集合,还是需要统计重复数据的场景,都可以帮助我们更高效地处理关联数据。基本上在开发中都会用到的,大家多看看,一定要掌握。
都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!