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

C++,STL容器,map/multimap:映射/多重映射深入解析 在C++标准模板库(STL)中,map和multimap是两种重要的关联容器,它们基于红黑树实现,具有自动排序特性。这对容器适合需要快速查找和有序数据管理的场景。 阅读详情

 #1024程序员节 | 征文# 

往期回顾:

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

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

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


 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 的区别

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

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

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

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

C++,STL容器,unordered_map/unordered_multimap:无序映射/无序多重映射深入解析 unordered_map和unordered_multimap是C++11引入的哈希关联容器,提供平均O(1)时间复杂度的键值对存储与访问能力。它们与map/multimap的核心区别在于不维护键的顺序,通过哈希表实现快速查找。 阅读详情

相关推荐

Ubuntu22.04 apt 安装 ROS1 ROS Noetic Ninjemys

ubuntu 22.04 apt-get 安装 ros1 ros Noetic 最新版

autolabor的博客 5万+

多重集合(multiset)和多重映射(multimap)

首先看关联容器分类: 多重集合是允许有重复元素的集合,多重映射是允许一个键对应多个数据的映射。 示例代码: #include #include #include #include using namespace std; int main() { multimap<string, string>courses;//定义多重映射 typedef multimap<string, ...

zjn15000的博客 1223

vhr 微人事系统安装与部署教程(SpringBoot + Vue 项目实战)

vhr(微人事)是一个开源的人力资源管理系统项目。系统采用前后端分离架构,主要技术栈包括:后端:MyBatis前端:VueElement UIAxios数据库:MySQL系统通常包含以下模块:员工管理部门管理职位管理薪资管理权限管理系统管理整体功能已经接近企业级后台系统。vhr(微人事)是一个非常经典的开源人力资源管理系统项目,基于SpringBoot + Vue 前后端分离架构。系统包含:员工管理部门管理权限管理薪资管理。

m0_69484557的博客 486

C++容器之多重映射(std::multimap)

多重映射是关联容器,用于存储由键值和映射值的组合形成的元素,遵循特定顺序,并且其中多个元素可以具有等效键。

flysnow010的博客 1142

iOS开发者必备:从越狱设备里提取IPA的三种方法(含Filza、iTools实战)

本文详细介绍了iOS开发者从越狱设备提取IPA文件的三种实用方法,包括使用Filza文件管理器、AFC2配合桌面工具以及命令行高级技术。内容涵盖环境准备、操作步骤和技术原理,帮助开发者高效获取应用包文件,适用于逆向工程、测试分析等场景。

weixin_28717969的博客 817

LangChain实战:Plan and Execute代理在智能预算规划中的应用

本文详细介绍了如何利用LangChain框架中的Plan and Execute代理实现智能预算规划。通过拆解复杂财务问题、调用多工具链协作,该代理能自动完成从个人月度预算到家庭年度综合预算的智能规划,并具备消费习惯学习和多目标优化等进阶功能,帮助用户实现精准财务管理和决策优化。

weixin_42530732的博客 382

【STL】多重集合multiset和多重映射multimap

本文的所有语句都经本人验证,均正确使用。由于本文涉及内容比较多,为了尽可能的讲详细些,会把各种例子附上,所以代码样例会比较多,也为了更好的布局,本系列将分开讲解,并且前期为了更加贴合实战需求,暂时只对一些常用的STL容器和基本功能进行讲解。为了使每篇文章具有一定的独立性,后续的文章大多数会将之前文章涉及的知识点中提取,并且在后续会将相应的例子补上。本文STL系列知识参考《C++语言程序涉及(第5版)》

weixin_45720193的博客 943

3分钟创建智能体

智能体简介会在首页以及名片页展示,需要简洁明了的介绍智能体用途✅优秀示例:最好用第三人称直接说明智能体用途~如:打造生动文案好帮手、专业解梦,探寻梦境奥秘等❌反面教材:简介并未介绍用途、语义含糊。如:今天写点啥、看看你做的梦等以上步骤完成后,点击发布,就能成功创建属于你自己的智能体啦~仅自己可访问(免审):发布后仅开发者本人账号可访问、预览、使用该智能体仅链接可访问:发布后任何人均可通过链接访问、预览、使用该智能体。

soso1968的博客 2084

c++ STL 之多重映射与多重集—— multiset 与 multiset 详解

multiset 与 multiset是stl的两个关联容器,名叫“多重映射”和“多重集”,何为“多重映射”和“多重集”?其实就是一个数组,但有了数组何必还需“多重映射”和“多重集”

zhhg0123的博客 1830

Unity零基础到入门 ☀️| 【UI系统学习】轻松学会 Unity 的 UGUI基础控件的使用(包括一个简易血条、蓝条设计)

Unity,UGUI。本篇博客来挑几种Unity中最常用的UI控件如何使用和使用技巧,包括一个简易血条蓝条的小实例

努力前行,总会成为自己心中的那道光 2万+

【全网首发】2026华为OD双机位C卷 机考真题题库含考点说明以及在线OJ (Java)

如果你收到的是双机位C卷考试通知,需要针对性地调整备考策略。自2025年11月19日起,华为OD机试已正式从双机位A卷切换至。复杂度明显提升,需要组合多个算法点。题面相对简单,直接考查编程基本功。考查问题分析、算法选择和优化能力。通常为1-2个核心算法点的应用。

算法大师! 165

Day 28 C++ (映射)map 容器 / multimap 容器 (多重映射)

C++中的map是一种关联容器,它提供了一种键-值(key-value)对的存储方式。map容器中的元素是按照键的顺序进行排序的,并且每个键都唯一。通过使用键来访问其相应的值,我们可以在O(log n)的时间复杂度内进行快速的查找、插入和删除操作。map与set类似,但不同之处在于map存储的是键值对(key-value pair),而set只存储单个元素。每个键值对在map中被视为一个元素,由键(key)和值(value)组成。键用于唯一标识元素,值则是与键相关联的数据。

缺点灵气儿的笔记本 529

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【C++】STL 容器总结 ( STL 各容器特点 | STL 个容器使用场景 | 单端数组容器 | 双端队列容器 | 双向链表容器 | 集合容器 | 多重集合容器 | 映射容器 | 多重映射容器 )

一、STL 各容器特点 1、std::vector 单端数组容器 2、std::deque 双端队列容器 3、std::list 双向链表容器 4、std::set 集合容器 5、std::multiset 多重集合容器 6、std::map 映射容器 7、std::multimap 多重映射容器 二、STL 各容器特点总结 三、STL 各容器使用场景示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 6693

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【c++丨STL】map/multimap的使用

与set相同,map的底层也是基于红黑树实现的,其内部元素根据键自动升序排列。但两者有如下区别存储内容:set存储的是键,而map存储的是键值对(数据元素是一个pair。元素访问:set只能访问键,而map可以通过键来访问对应的值,并且值可以支持修改。因此,set适用于唯一元素的集合操作,如去重;而map更适用于处理键值关系。相比map,multimap支持多个相同键存在。

2301_80955819的博客 1648

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

48 C++ STL模板库17-容器9-关联容器-映射(map)多重映射(multimap)

本文介绍了STL中的关联容器map和multimap,它们以键值对形式存储元素,底层基于红黑树实现,保证元素有序排列。map的键唯一,而multimap允许重复键。文章详细说明了它们的构造函数、赋值操作及迭代器使用方法,包括正向/反向遍历、常量迭代器等。此外,还介绍了自定义比较器、性能优化技巧及迭代器失效问题。这些容器适用于需要快速查找和动态管理键值对数据的场景。

17208955的博客 1012

C++中STL容器总结

STL容器1、容器分类 1、容器分类 STL中通常将容器分为三类:顺序容器、关联容器和容器适配器。 1、顺序容器 是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。 顺序容器包括: vector(向量)、list(列表)、deque(队列)...

EricLee23 2363

C++ 入门第 21 天:STL 容器之无序映射与无序多重映射

C++ 入门第 21 天:STL 容器之无序映射与无序多重映射 一、前言在前一节中,我们学习了无序集合(unordered_set)及其变种。在实际开发中,除了存储单个元素外,我们常常需要存储键值对(key-value)数据。例如,通过一个键快速找到对应的值。在 C++ 中,unordered_map 和 unordered_multimap 便是专门用于处理无序键值对的容器。这两个容器基于哈希表实现,能够以平均 O(1)O(1)O(1) 的时间完成插入、删除和查找操作。

LF__plus的博客 986

C++ STL标准库:关联容器 多重映射multimap

文章目录1. 简介2. 使用 multimap - C++ Reference (cplusplus.com) 1. 简介 multimap(多重映射)是一种存储键值(key-vauekey是 允许重复的、有序的 关联容器。 multimap内部结构采用红黑树(Red-Black tree)的平衡叉树,它可以在O(log n)时间内高效的做查找,插入和删除。 2. 使用 #include<map> #include<iostream> using namespace std;

超级大洋葱的博客 1318

【C++】一文速通STL六大组件之容器

STL容器【保姆式教学】,主要针对STL中容器版块的详细教学。 STL的容器种类分为顺序性容器、关联式容器和容器适配器 vector(向量)、deque(双端队列)、list(双向循环链表)、stack(堆栈)、map(映射)

做技术人 · 产优质博客 · 找好工作 2937

STL map初始化、插入与删除的几种方法 / multimap 介绍

map map 是一种关联式容器,包含关键字 / 值 对,一对一 有着映射关系

浪子花梦 4082

关联式容器:map 与 multimap 的键值对存储

map(映射):存储唯一关键字(key)的键值对,自动按关键字升序(默认)排序,不允许重复key。若插入重复key,会被自动忽略,不会报错;每个key唯一对应一个value,实现“一对一”映射。multimap(多重映射):存储可重复关键字(key)的键值对,自动按关键字升序(默认)排序,允许重复key。若插入重复key,会全部保留,且按排序规则插入到对应位置,维持整体有序;一个key可对应多个value,实现“一对多”映射。

qq_43402143的博客 858

C++STL标准库中的常用容器总结

C++ STL(标准模板库)提供了多种容器类型及其对应的迭代器,用于实现高效的数据操作。迭代器分为五种类型(随机访问、双向、前向、输出和输入迭代器),不同容器支持不同类型的迭代器。容器主要包括四大类:序列容器(array、vector、deque)、链表容器(forward_list、list)、容器适配器(stack、queue、priority_queue)和关联容器(有序/无序的set/map系列)。

SeeDoubleU的专栏 5376

【C++】STL常用容器总结之十:多重映射multimap和多重集合multiset

11、多重映射multimap和多重集合multiset由于multimap/multiset与map/set有太多的相似之处,故在这里我们一起进行介绍。首先需要指出的是,multimap的特性以及用法与map完全相同,唯一的差别在于它允许键值重复。同样,multiset的特性以及用法与set完全相同,唯一的差别在于它也允许键值重复。 Map和set容器中,一个键只能对应一个实例,而multima

长相忆兮长相忆的专栏 2487

stl之multimap容器

multimap与map一样,都是使用红黑树对记录型的元素数据按元素键值的比较关系,进行快速的插入、删除和检索操作,所不同的是multimap允许插入具有重复性键值的元素。 在multimap容器中,元素的键值与元素的映照数据的映照关系是多对多的,即multimap是多重映照容器。 由于元素键值允许重复,使得数组操作符“[]”利用键值来访问元素没有意义,故而multimap并没有定义数组方式的“[]

Hao_09的专栏 1752

c++ STL容器 --- 单映射map、多重映射multimap

包含头文件<map> 映射代表的是一种关系,有点类似哈希结构(数据的一个抽象地址和这个元素的一个关系) 也可以把它叫做关联式容器 map<int, string> mapData; //创建一个map容器 map 里面存储的数据是一个数对类型 在 c++ 当中有一个数对类型的结构体,pair 类型:两种类型的模板类,把两个类型强制关联在一起,第一个 first,第二个 second,要用两个类型去做实例化 #include <map> #inclu.

weixin_60569662的博客 1049
上一篇: C++ 入门16:STL 容器之集合(set)与多重集合(multiset)
下一篇: <<软件测试与验证>>期末复习题(弄懂稳过!!!)
从一的
博客等级 码龄5年 1995粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值