C++进阶 —— multimap

c++入门笔记-map/multimap容器 map中所有的元素都是对组pair pair中的第一个元素为key(键值) 起到索引作用 第二个元素为value(实值) 所有元素会根据元素的键值自动排序本质 :map/multimap属于关联式容器 底层结构是二叉树类型实现 优点:非常的高效能 可以根据key值快速的找到value值 具有有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作缺点:空间占用率大 因为底层的数据结构是红黑树实现的 每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得 阅读详情
AI摘要

本文介绍了C++中multimap的基本概念及其作为关联容器的特点,支持重复键的有序存储。详细说明了pair类和make_pair函数的作用,并解析了multimap的常用成员函数与底层实现机制,适用于高效查找与遍历场景。

目录

一,multimap介绍

 类pair

函数模板make_pair

二,multimap成员函数


一,multimap介绍

  • multimap是关联容器,按照特定的次序存储元素(由键key和值value组合而成的键值对),key可重复;
    • 键key通常用于排序及唯一标识元素,而值value则存储与键key关联的内容;
    • 键key和值value的类型可能不同,且在map的内部,key与value通过成员类型value_type绑定在一起;
    • key是唯一的,并且不能修改;
    • map中的元素如用迭代器去遍历,可以得到一个有序序列;
typedef pair<const Key, T> value_type;
  • multimap中的元素始终根据其key按照其内部比较对象(compare)所指示的特定严格弱排序准则进行排序;
  • multimap通过key访问元素的速度通常比unordered_multimap容器慢,但使用迭代器直接遍历multimap中的元素可以得到关于key的有序序列;
  • multimap通常被实现为二叉搜索树(红黑树),查找效率比较高O(logN);

注:multimap与map唯一不同就是,map中key是唯一的,multimap中key是可以重复的;

 类pair

template <class T1, class T2> struct pair;
  • 此类将一对值组合在一起,类型可以不同;
  • 可直接访问其公共成员变量first、second;
  • pair是tuple的特殊形式;

std::pair<int, double> p1(1, 2.5); //initialization (3) 初始化构造
std::pair<long, float> p2(p1);    //copy/move (2) 调用模板拷贝构造函数,会进行类型转换
std::pair<long, float> p3(std::move(p1)); //copy/move (2) 调用模板移动构造函数,会进行类型转换
std::pair<int, double> p4(p1);    //copy/move (2) 调用默认拷贝构造函数
std::pair<int, double> p5(std::move(p1)); //copy/move (2) 调用默认移动构造函数

函数模板make_pair

  • 构建一个pair对象,第一个元素为x,第二个元素为y;
  • 通过传递的参数可隐式的推导模板类型;
template <class T1, class T2>
  pair<V1,V2> make_pair (T1&& x, T2&& y);

//此函数返回,初始化构造一个pair对象,对参数进行完美转发
  pair<V1,V2>(std::forward<T1>(x),std::forward<T2>(y))
//自动推导类型,不需要显式指定类型
auto p1 = std::make_pair(1, "hello");        // pair<int, const char*>
auto p2 = std::make_pair(3.14, true);        // pair<double, bool>

//隐式转化 pair<double,char>
std::pair <int, int> bar;
bar = std::make_pair(10.5, 'A'); 

//完美转发
string str = "world";
auto p3 = std::make_pair(std::move(str), 42); // 移动语义,str 被转移

二,multimap成员函数

  • multimap中key是可以重复的;
  • multimap中的元素默认将key按照小于来比较;
  • multimap中没有重载operator[]操作;

构造函数

操作函数

//迭代器
      iterator begin() noexcept;
const_iterator begin() const noexcept;
      iterator end() noexcept;
const_iterator end() const noexcept;
      reverse_iterator rbegin() nothrow;
const_reverse_iterator rbegin() const nothrow;
      reverse_iterator rend() nothrow;
const_reverse_iterator rend() const nothrow;

//插入
single element (1)	
    iterator insert (const value_type& val);
    template <class P> iterator insert (P&& val);
with hint (2)	
    iterator insert (const_iterator position, const value_type& val);
    template <class P> iterator insert (const_iterator position, P&& val);
range (3)	
    template <class InputIterator>
    void insert (InputIterator first, InputIterator last);
initializer list (4)	
    void insert (initializer_list<value_type> il);

//删除	
iterator  erase (const_iterator position);
size_type erase (const key_type& k);
iterator  erase (const_iterator first, const_iterator last);

//查找
      iterator find (const key_type& k);
const_iterator find (const key_type& k) const;

bool empty() const noexcept;
size_type size() const noexcept;
size_type count (const key_type& k) const;
void swap (multimap& x);
void clear() noexcept;

key_compare key_comp() const;
value_compare value_comp() const;

      iterator lower_bound (const key_type& k);
const_iterator lower_bound (const key_type& k) const;
      iterator upper_bound (const key_type& k);
const_iterator upper_bound (const key_type& k) const;

pair<const_iterator,const_iterator> equal_range (const key_type& k) const;
            pair<iterator,iterator> equal_range (const key_type& k);
int main()
{
	multimap<string, string> m;
	
	m.insert(pair<string, string>("peach", "桃子")); 
	m.insert(make_pair("banan", "香蕉"));
	m.insert(make_pair("banan", "香蕉"));
	cout << m.size() << endl;
	cout << m.count("banan") << endl;

	for (auto& e : m)
	{
		cout << e.first << "-->" << e.second << endl;
	}

	m.erase("banan");

	multimap<string, string>::iterator it = m.begin();
	while (it != m.end())
	{
		cout << (*it).first << "-->" << (*it).second << endl;
		++it;
	}

	it = m.find("peach");
	cout << (*it).first << "-->" << (*it).second << endl;
	return 0;
}

突破编程_C++_STL教程( multimap 的实战应用) C++ STL教程: multimap 的实战应用 阅读详情

相关推荐

进阶C++__STL__set/ multiset和map/ multimap使用方法

一、关联式容器 二、键值对 三、树形结构的关联式容器 set/ multiset 容器 set基本概念 set构造和赋值 set大小和交换 set插入和删除 set查找和统计 set和multiset区别 set / multiset总结 pair对组创建 set容器排序 内置类型指定排序规则 自定义数据类型指定排序规则 map/ multimap容器 map基本概念 map构造和赋值 map大小和交换 map插入和删除 map查找和统计 map容器排序 map

qq_61386381的博客 1259

multimap的介绍及使用

multimap的介绍及使用 1、multimap的介绍 1、multimap是关联式容器,它按特定的次序(按照key来比较)存储由键key和值value组合而成的元素,多个键值对之间的key可以重复 2、在multimap中,键值key通常用于排序和唯一标识元素,值value中存储与键key关联的内容。 3、multimap按照指定的严格弱排序对key进行排序 4、multimap中通过键值访问单个元素比unordered_multimap容器慢,使用迭代器直接遍历multimap的元素可以得到关于ke

gp1330782530的博客 3万+

【046】C++中map和multimap容器全面解析:深入学习,轻松掌握

在C++中,map和multimap容器是非常重要的数据结构,它们提供了一种键值对的映射关系,可以高效地组织和访问数据。map容器中的每个元素都包含一个键和一个值,而multimap容器允许键重复。这两种容器在实际项目中广泛应用,特别适合需要快速查找和插入元素的场景。其底层实现采用了红黑树等高效的数据结构,map和multimap容器在处理大量数据时具有良好的性能表现。它们也提供了丰富的操作方法和函数,可以轻松地对容器中的数据进行插入、删除、查找和遍历操作。

Lion_Long的博客 3955

突破编程_C++_STL教程( multimap 的基础知识)

C++ STL教程: multimap 的基础知识

突破编程 3415

NeurIPS‘25新研究!PINN+GNN强强联手,模型精度飙升50%!

物理图神经网络研究取得重大进展!UCLA团队提出的PhysGNN架构在NeurIPS'2025上引发关注,该模型成功融合PINN的物理约束优势与GNN的图结构处理能力,解决了工程仿真中的关键瓶颈。研究显示,PhysGNN在城市热网预测中误差降低42%,电网负荷模拟的物理规则违反率下降68%。同步解析的SyncTREE模型则创新性地将RC树物理特性融入GNN,实现毫秒级IC时序分析;HSPGNN模型通过嵌入偏微分方程,显著提升多变量时间序列填补精度。

m0_73122726的博客 1021

ue4 角色奔跑/冲刺/蹲下 /蹲走 动作切换蓝图

序列:文章分为4部分: 一、准备工作+简单的蓝图连线 二、编写“行走” 混合空间 三、编写“蹲下”混合空间 四、合成2个动画,设置动画蓝图 —————————————— 一、准备工作 下载“动画初学者包”,添加到项目! 主要文件: 打开BP_playerCharacter,组价——添加组件,找到“摄像机”,“机臂” 没有找到就去其他项目复制过来 ———————————— 手写人物的移动,也可以在...

凉城古梦猫扑街的博客 4862

C++进阶STL-map、multimap

map\multimap容器 (1)map相对于set来说,map具有键值和实值,将元素组合成pair再插入到map容器,pair的第一个元素被称为键值,第二个元素被称为实值。 (2)map也是以红黑树为底层的实现机制,map容器根据插入元素的键值会自动排序 (3)map的键值不可以重复,实值可以重复,multimap键值实值都可以重复 (4)map的键值不可修改,可以改变实值,想修改...

zzyczzyc的博客 315

2021-10-29 atcoder ABC157——B - Bingo

B - Bingo 先标记,然后暴力判断,这样最清晰最好想。 #include<iostream> #include<algorithm> #include<cstring> using namespace std; typedef long long LL; int a[110][110],b[110]; int main() { for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) cin>>a[i]

honeistbutter的博客 337

C++进阶:详细讲解容器set与map(pair、multiset、multimap)

上次介绍了搜索二叉树 为了介绍后面的AVLTree和红黑树,我们要进行一些铺垫,就是set与map的介绍啦

qq_74415153的博客 2416

3D美术14——max——fbx导入max后直接生成bip人形骨骼插件

最近经常会从unity里反八FBX到max里进行2次修改。 但是非常尴尬的事情就是,就是用max做的fbx,你在反导入回来,BIP骨骼都会变成预制体。这个时候有一个方法补救。那就是在导入的时候调整一下参数。(如下图) 把这里调整成设置为骨骼。就还可以了。 但是,如果你不是用max做的FBX。呵呵,那么你一定很头大,因为完全没有用。 所以,这个时候就要上插件了。 Autofbxtobip v.1.1 这个插件适用于2015及其以上版本。 在这之前我还用过一款叫BIPPY,但是效果相当感人,照着这个图片调整

qq_37576129的博客 1万+

[AI8051U入门第一步]环境安装和按键控制流水灯

本文介绍了AI8051U单片机的开发环境搭建及GPIO应用。主要内容包括:1)通过ISP软件完成Keil开发环境配置;2)AI8051U特性介绍,包括32位8051内核、浮点运算单元及丰富外设;3)GPIO输入输出模式解析,并附流水灯控制代码;4)提供完整的系统初始化、延时函数及LED控制代码实现。文章配套资源包含完整工程代码,适用于智能硬件及物联网开发。

sinat_58149788的博客 670

C++进阶——STL源码之map与multimap

STL源码之map与multimap map map的特性是,所有元素都会根据元素的键值自动被排序; map的所有元素都是pair,同时拥有实值(value)和 键值 (key),pair的第一个元素视为键值,第二个元素视为实值; map不允许两个元素具有相同的键值。 map的迭代器可以用来修改元素的实值(value),修改元素的实值并不会影响map的排列规则; map的迭代器不可以用来改变map的键值,因为修改map的键值会严重破坏map的结构。 map对其中的元素进行删除或者新增操作,操作之前的

qq_25065595的博客 673

比NTP还牛逼的时间同步协议:1588v2,亚微秒级!

1588v2,又称为Precision Time Protocol Version 2,即精密时间协议的第二版本,或称为PTPv2,是一种精密时间同步协议标准,旨在实现网络中设备之间的高精度时间同步。该协议由IEEE标准组织发布,并在网络测量和控制系统中得到广泛应用。1588v2的主要目的是在计算机网络中提供高度准确的时间同步。它可用于确保不同设备之间的时钟同步,从而协调它们的操作。这对于需要协同工作的系统、无线通信基站等具有关键性的应用非常重要。

网络技术联盟站 4280

C++进阶 -- set、map、multiset、multimap的介绍及使用

本文系统介绍了C++ STL中的关联式容器,包括set、map、multiset和multimap。关联式容器以键值对形式存储数据,相比序列式容器具有更高效的数据检索能力。文章详细解析了键值对结构pair的定义和使用方法,以及各类关联式容器的特点:set存储唯一值,multiset允许重复值;map存储唯一的key-value对,multimap允许key重复。同时介绍了这些容器的常用操作,如插入、查找、删除等,并对比了不同容器在底层实现(红黑树)和功能特性上的差异。

weixin_73359101的博客 747

【人工智能】全面盘点国内AI九大模型:各擅胜场的智能先锋(豆包、文心一言、讯飞星火、通义千问、Kimi、智谱清言、腾讯元宝、秘塔、天工AI)

追求性价比与全能:选豆包,适合个人与中小企业日常使用;侧重中文创作与理解:选文心一言,文学与商业文案创作首选;需要专业语音交互:选讯飞星火,智能客服、车载场景必备;看重生态与多场景:选通义千问,适配电商、办公等企业需求;处理超长文本任务:选Kimi,文档分析、学术研究的利器;专注深度推理创作:选智谱清言,学术与创意写作的伙伴;依赖腾讯生态协同:选腾讯元宝,日常轻量需求的便捷之选;深耕法律学术领域:选秘塔,专业文本处理的权威工具;布局前沿技术体验:选天工AI,享受接近国际顶尖的智能服务。

奶爸的编程之路,也就一周冷个三天 1121

ZYNQ PL通过EMIO ETHE1外接PHY由GMII转RGMII

1,设置EMIO方式引出ETHE1 2,从GMII过度到RGMII GMII: 发送 gmii_tx_clk gmii_tx_d[7:0] gmii_tx_en gmii_tx_er 接收 gmii_rx_clk gmii_rx_d[7:0] gmii_rx_dv gmii_rx_er RGMII: 发送 tx_clk tx_d[3:0] tx_ctrl 接收 rx_clk rx_d[3:0] rx_ctrl 首先数据总线从时钟单边沿采样8bit转变为了双边沿采样4bit,从88E1

wangjie36的博客 1万+

【C++进阶04】STL中map、set、multimap、multiset的介绍及使用

set和map的定义及使用,关联式容器,键值对

2302_76421042的博客 4046

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++进阶—map、set及multimap、multiset(1)

set文档介绍set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。

IfYouHave的博客 285

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++进阶——STL源码之unordered_map、unordered_multimap

STL源码之unordered_map、unordered_multimap STL中几种map的区别 map   内部数据的组织,基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。 hash_map   基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域进行保存。 插入操作:得到key -> 通过hash

qq_25065595的博客 2170

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【C++进阶】multiset和multimap与set和map之间的区别

multiset和multimap与set和map之间的区别

m0_67077469的博客 461

C++ STL进阶与补充(map/multimap容器)

C++ STL map/multimap容器

Lao_tan的博客 272

C++ 关联式容器进阶:map 深度解析与 multiset/multimap 应用

本文深入解析了C++关联容器的核心特性与应用。首先详细剖析了map的operator[]操作,揭示其查找、插入和修改的三重功能,并对比了与insert方法的差异。接着介绍了允许重复元素的multiset和multimap,包括其特性、常用操作及适用场景。最后通过LeetCode高频单词排序案例,展示了如何组合使用map和multimap解决实际问题。文章强调应根据需求选择合适的容器,合理运用这些工具能显著提升代码效率和可读性。

kongsicheng10的博客 822

C++进阶之允许重复键std::multimap:用法实例(三百七十四)

本篇目的:C++进阶之允许重复键std::multimap:用法实例基本概念是 C++ 标准库中的一个关联容器,它与std::map相似,但允许一个键对应多个值。按照键的顺序自动排序,并且可以存储重复的键值对。有序性内部按照键的顺序进行排序,默认使用运算符,也可以通过自定义比较器来控制键的排序方式。它保持键的有序性,因此在遍历时,键总是按照设定顺序排列。重复键值对与std::map不同,允许一个键出现多次,且每个键都可以对应不同的值。这使得能够存储多个具有相同键但不同值的元素,适用于需要存储重复键的场景。

Android系统攻城狮 1720

C++进阶学习:STL常用容器--map/multimap容器

map 中所有元素都是 pairpair 中第一个元素为 key (键值) 起到索引运用 第二个元素为 value(实值)所有元素都会根据元素的键值自动排序本质:map/multimap 属于关联式容器 底层结构是用二叉树实现优点:可以根据 key 值快速找到 value 值map 和 multimap 的区别:map 中不允许有重复的key值multimap 中允许有重复的key值。

Miki Makimura 的博客 202

【C++进阶】:(5) map与multimap——从键值对到常用接口与实战

学完set再学习map,其实会发现两者非常像。setkey而mapmap中真正决定元素位置的是 key,所以 key 不能直接修改;value 不影响红黑树的排列,因此可以修改。insert()find()count()erase()operator[]at()operator[]它不是单纯的查询接口。key + value默认值m[key]既可以插入,也可以查找,还可以修改。multimap则是在map。

2501_90703620的博客 162
上一篇: C++进阶 —— map
下一篇: C++进阶 —— 列表初始化(C++11新特性)
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值