C++ 入门17:STL 容器之映射(map)与多重映射(multimap)

 #1024程序员节 | 征文# 

往期回顾:

C++ 入门14:STL 容器之向量(vector)-CSDN博客

C++ 入门15:STL 容器之列表(list)-CSDN博客

C++ 入门16:STL 容器之集合(set)与多重集合(multiset)-CSDN博客


 C++ 入门17:STL 容器之映射(map)与多重映射(multimap)

一、前言

在前面文章的学习中,我们学习了 STL 中的 vectorlist 等容器。这些容器主要用于存储线性数据,但有时候我们需要存储键值对(key-value pair),这种场景下就需要使用映射(map)容器。今天我们将学习 C++ 标准模板库(STL)中的 mapmultimap,它们都可以用来存储键值对,记住最重要的区别: 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. mapmultimap 的区别

特性mapmultimap
键是否唯一唯一可以重复
插入操作如果键已存在,无法插入可以插入重复键
查找操作返回一个键对应的值返回多个键对应的值

5. 映射的高级操作

5.1自定义排序规则

默认情况下,mapmultimap 是按键的升序排序的。如果需要自定义排序规则,可以通过传递比较函数实现。

示例:

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 允许多个相同的键。无论是处理需要排序的元素集合,还是需要统计重复数据的场景,都可以帮助我们更高效地处理关联数据。基本上在开发中都会用到的,大家多看看,一定要掌握。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值