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的核心区别在于不维护键的顺序,通过哈希表实现快速查找。 阅读详情

相关推荐

4×V100部署Qwen3.8-Flash-Next:vLLM/GGUF实战

大模型本地部署的核心,是把参数量、量化精度、显存容量和推理框架放在同一张账本里算清楚。MoE 模型总参数量大但激活参数少,解码阶段更受显存带宽与 KV Cache 限制;通过 INT4/AWQ 或 GGUF 等 4-bit 量化可显著压缩权重占用,再结合 vLLM 张量并行、llama.cpp 分层切分提升多卡利用率。其技术价值在于让 V100 这类老架构 GPU 也能承载百亿级参数模型的私有化推理,并服务于 RAG 知识库、工作流 API、批量生成等场景。这次围绕 4×V100 32G 部署 Qwen3.

weixin_29061425的博客 349

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

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

zjn15000的博客 1223

Field _II 仿真 学习笔记

参考Field II的使用说明,进行了四个例子的练习。仿真程序和结果如下: PURPOSE1:Calculate the received response from all elements of a linear array and plot the responses and the summed response 【计算来自所有线性阵元的接收响应,并绘制该响应以及叠加响应。】 >>

qq_34018578的博客 1万+

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

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

flysnow010的博客 1142

保姆级教程:用Vue3+Element Plus快速搭建Flowable流程定义管理后台界面

本文提供了一份详细的Vue3+Element Plus教程,指导开发者快速搭建Flowable流程定义管理后台界面。从项目初始化、核心页面设计到响应式数据处理,全面覆盖前端开发关键步骤,帮助提升企业级应用开发效率。

weixin_42662293的博客 480

CAN-do-paser:Java开发的CAN总线数据帧解析库

CAN总线数据帧使用DBC文件信息解析为物理量,基于Java开发的数据解析工具。

佳瑞的博客 1133

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

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

weixin_45720193的博客 943

KVM — 与 QEMU 和 Libvirt 的关系

目录目录 前言 KVM QEMU KVM 与 QEMU qemu-kvm Libvirt Libvirt 在 OpenStack 中的应用前言如果是刚开始接触虚拟机技术的话, 对上述的概念肯定会有所混淆, 傻傻的分不清. 尤其在看虚拟化技术文档时导致理解能力下降, 所以在开始学习虚拟化技术之前对这些概念有一个整体的认识和清晰的理解, 就显得很有必要了.KVMKVM(Kernel-basedVirtu

烟云的计算 5737

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

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

zhhg0123的博客 1830

从 Classic ABAP 到 ABAP Cloud:一份面向开发者的 SAP 学习路线图与实战指南

ABAP技术演进路线:从语法到架构思维 本文系统梳理了现代ABAP开发者的能力成长路径。在S/4HANA与云时代,ABAP已从传统过程式语言转变为支持面向对象、测试驱动和云原生开发的现代技术栈。学习路线应围绕四大核心维度展开:1) 语言基础(ABAP OO/Modern ABAP);2) 工程化实践(ABAP Unit/ATC/Clean ABAP);3) 数据建模(CDS/AMDP);4) 服务化架构(Gateway/OData/Fiori)。文章强调以交付形态倒推技术栈,通过真实案例展示了如何将零散技术

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 361

物料分类账-返工工单(自身)差异分摊逻辑

如上图所示,当月入库的全部消耗,而返工消耗的数量为100PCS,所以返工消耗占总消耗的比例为100pcs/(205pcs+100pcs)=0.327868852。备注:红色箭头的物料号为产品自己本身所产生的价差,就是返工工单所承担的差异,而我们要计算的就是这个值,所以计算价差不会包括此项。价差合计就是不包括初始分摊的价差9153.7,剩下的价差合计就是返工工单自身所承担的差异4465.21。每一次返工工单所承担的差异都会按照价差*承担比例去计算承担的差异,知道承担完所有差异。

Yeol827的博客 2493

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

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

缺点灵气儿的笔记本 529

Java 类与对象 -- Java 语言的类与对象、构造器、static、final、包和 JAR

本篇文章我们将深入了解 Java 语言中的类与对象,探讨构造器、`static`、`final`、包和 JAR 文件。这些概念是面向对象编程的核心,对于理解和掌握 Java 至关重要。

栗筝i的博客 5037

【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

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

2301_80955819的博客 1648

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

17208955的博客 1012

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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、付费专栏及课程。

余额充值