C++ map类成员介绍 (map与multimap)

目录

🤔map模板介绍:

🤔特点:

🤔map容器与哈希表:

🤔map的成员函数:

🙂map构造函数:

代码示例:

运行结果:

🙂map赋值函数:

代码示例:

运行结果:

🙂 map判断函数:

代码示例:

运行结果:

🙂 map的删除和插入:

代码示例

 运行结果:

🙂 map的查找函数:

代码示例:

运行结果:

🙂 map自定义排序:

代码示例:

🤔multimap:

🙂特点:

代码示例:

运行结果:

🙂multimap与map的区别:

🤔结束!


🤔map模板介绍:

              📖map是C++中的关联容器之一,它提供了一种将键与值相关联的方式。它的实现基于红黑树,具有自动排序和快速查找的特性。其中,键是唯一的,相同的键只能存在一个,而值则可以重复。map的基本操作包括插入、删除、查找等,还支持迭代器遍历和基于范围的操作。可以使用中括号运算符或者迭代器来访问map中的元素,也可以使用find函数查找指定键对应的值。由于map是基于红黑树实现的,因此其插入和查找的时间复杂度均为O(logN)

🤔特点:

📖1. Map容器是C++ STL库中的重要容器之一,它可以快速查找和访问键值对

📖2. 和其他STL容器一样,Map容器可以存储多种数据类型,包括内置数据类型和自定义类型。

📖3. Map容器的底层实现是一个红黑树,这使得它的插入与查找速度都很快,且仅需O(log n)的时间复杂度。

📖4. Map容器中的元素按照键进行排序,默认是按照键的升序进行排序。也可以通过自定义排序规则来进行降序排序。

📖5. Map容器的迭代器支持正向迭代和反向迭代

📖6. Map容器有许多与迭代器相关的函数,如begin()、end()、rbegin()、rend()等,可以很方便地对容器进行遍历和操作。

📖7. Map容器还有许多成员函数,如size()、empty()、find()、insert()、erase()等等,以方便对容器进行封装和使用。

📖8. 使用Map容器时需要注意,由于红黑树是动态平衡的,因此它的插入、删除等操作会带来一定的时间复杂度,需要根据具体需求进行权衡和选择。


🤔map容器与哈希表:

Map哈希表的相同之处在于它们都是用来存储键值对的容器,都可以快速查找和访问元素。具体来说,它们的相同点包括:

📖1. 都是关联式容器,元素之间的存储关系都是基于键的。

📖2. 都可以存储键值对,且可以任意添加、删除、修改元素。

📖3. 都可以快速查找元素,时间复杂度为O(1)或者O(logn)。

📖4. 都可以使用迭代器进行遍历,并且支持对元素的访问和修改。

📖5. 都可以存储自定义类型的数据,并可以自定义比较函数。

📖但是哈希表和Map容器不是同一个东西,它们是两种不同的容器类型。

📖Map容器STL库中的一个关联式容器,内部使用红黑树来存储和管理元素,通过键值来快速查找元素,键值对是按照键进行排序的。

📖哈希表是一种基于哈希函数实现的数据结构,通过将元素的关键字映射到桶中来进行元素的存储和访问,具有快速插入、查找和删除的优势。

虽然在使用中可以通过哈希表来实现Map容器,但它们本质上是不同的数据结构。事实上,在一些特定的场合下,哈希表比Map容器效率更高,例如需要在海量数据中查找键值对。但是由于哈希表的实现需要使用哈希函数,因此它的编写和调试会更加困难一些,而Map容器的实现则更加简洁易懂。在选择使用容器时需要根据具体的需求来做出选择。

🤔map的成员函数:

🙂map构造函数:

📖1.默认构造函数:map<T1,T2> mp; 

map<int, int> d1;

📖2.拷贝构造函数:map(const map & mp);

map<int, int> d2(d1);

代码示例:

#include<iostream>
#include<map>
using namespace std;
void printa(const map<int,int>& d)
{for (auto it = d.begin(); it != d.end(); it++){cout <<"键值为:" << it->first << "  ";cout <<"key值为:" <<it->second ;cout << endl;}}
void test01()
{	//默认函数构造map<int, int> d1;d1.insert(pair<int, int>(2, 32));d1.insert(pair<int, int>(5, 62));d1.insert(pair<int, int>(3, 22));d1.insert(pair<int, int>(7, 72));d1.insert(pair<int, int>(6, 882));d1.insert(pair<int, int>(4, 38));cout << "默认函数构造结果为:"<<endl;printa(d1);//拷贝函数构造:map<int, int> d2(d1);cout << "拷贝函数构造结果为:" << endl;printa(d2);}
int main()
{test01();
}

运行结果:

🙂map赋值函数:

📖1.重载等号运算符:map & operator=(const map &map);

map<int, int> d3;
d3 = d1;

代码示例:

#include<iostream>
#include<map>
using namespace std;
void printa(const map<int,int>& d)
{for (auto it = d.begin(); it != d.end(); it++){cout <<"键值为:" << it->first << "  ";cout <<"key值为:" <<it->second ;cout << endl;}}
void test01()
{	//默认函数构造map<int, int> d1;d1.insert(pair<int, int>(2, 32));d1.insert(pair<int, int>(5, 62));d1.insert(pair<int, int>(3, 22));d1.insert(pair<int, int>(7, 72));d1.insert(pair<int, int>(6, 882));d1.insert(pair<int, int>(4, 38));cout << "默认函数构造结果为:"<<endl;printa(d1);//重载等号运算符:map<int, int> d3;d3 = d1;cout << "重载等号运算符的结果为:" << endl;printa(d3);
}
int main()
{test01();
}

运行结果:

🙂 map判断函数:

📖1.返回容器中的元素个数:size();

📖2.判断容器是否为空:empty();

📖3.交换两个集合容器:swap();

代码示例:

 #include<iostream>using namespace std;
#include<map>
void printa(const map<int,int>& d)
{for (auto it = d.begin(); it != d.end(); it++){cout <<"键值为:" << it->first << "  ";cout <<"key值为:" <<it->second ;cout << endl;}}
void test01()
{	//默认函数构造map<int, int> d1;d1.insert(pair<int, int>(2, 32));d1.insert(pair<int, int>(5, 62));d1.insert(pair<int, int>(3, 22));d1.insert(pair<int, int>(7, 72));d1.insert(pair<int, int>(6, 882));d1.insert(pair<int, int>(4, 38));cout << "默认函数构造结果为:"<<endl;printa(d1);cout << "d1容器是否为空(0为非空,1为空)" << d1.empty()<<endl;cout << "d1容器的元素个数为" << d1.size()<<endl;map<int, int> d2;d2.swap(d1);cout << "d2与d1交换结果后d2为:" << endl;printa(d2);}
int main()
{test01();
}

运行结果:

🙂 map的删除和插入:

📖 1.在容器中插入元素:insert(elem);

📖 2.清除所有元素:clear();

📖 3.删除pos迭代器所指向的元素,返回下一个元素的迭代器:        erase(pos);

📖 4.删除区间[beg, end)的所有元素,返回下一个元素的迭代器:      erase(begin, end);

📖 5.删除容器中值为key的元素:erase(key)

代码示例

 #include<iostream>using namespace std;
#include<map>
void printa(const map<int,int>& d)
{for (auto it = d.begin(); it != d.end(); it++){cout <<"键值为:" << it->first << "  ";cout <<"key值为:" <<it->second ;cout << endl;}}
void test01()
{	//默认函数构造map<int, int> d1;//插入的四种形式://第一种:d1.insert(pair<int, int>(1, 10));//第二种:d1.insert(make_pair(2, 20));//第三种:d1.insert(map<int, int>::value_type(3, 30));//第四种:d1[4] = 40;cout << "默认函数构造结果为:"<<endl;printa(d1);d1.erase(d1.begin());cout << "删除了头部元素后结果为:" << endl;;printa(d1);d1.erase(5);cout << "删除key值为5的元素后结果为:" << endl;printa(d1);d1.erase(d1.begin(), d1.end());cout << "删除[beg,end)后结果为:" << endl;printa(d1);d1.insert(pair<int, int>(2, 32));d1.insert(pair<int, int>(5, 62));d1.insert(pair<int, int>(3, 22));d1.insert(pair<int, int>(4, 92));d1.insert(pair<int, int>(7, 82));cout << "重新插入后结果为" << endl;printa(d1);d1.clear();cout << "使用clear后结果为:";printa(d1);
}
int main()
{test01();
}

 运行结果:

🙂 map的查找函数:

📖1.查找key是否存在,如果存在,返回该元素的迭代器,如果不存在,返回end():find();
📖2.统计key的元素个数:count(key);

*由于map不允许重复的key值出现,因此查找一个key的个数不是0(不存在)就是1(存在);

代码示例:

#include<iostream>
using namespace std;
#include<map>
void printa(const map<int,int>& d)
{for (auto it = d.begin(); it != d.end(); it++){cout <<"键值为:" << it->first << "  ";cout <<"key值为:" <<it->second ;cout << endl;}}
void test01()
{	//默认函数构造map<int, int> d1;d1.insert(pair<int, int>(2, 32));d1.insert(pair<int, int>(5, 62));d1.insert(pair<int, int>(3, 22));d1.insert(pair<int, int>(7, 72));cout << "默认函数构造结果为:"<<endl;printa(d1);cout << "查找的键值为:" << d1.find(5)->first << "查找的key为:" << d1.find(5)->second << endl;cout << "查找的键值有:" << d1.count(5)<<"个"<< endl;}
int main()
{test01();
}

运行结果:


 

🙂 map自定义排序:

📖关键点:自己重写仿函数,定义排序规则。

代码示例:

#include<iostream>
using namespace std;
#include<map>
class d
{
public:bool operator()(int v1, int v2)const{return v1 > v2;}
};
void printa(const map<int,int,d>& d)
{for (auto it = d.begin(); it != d.end(); it++){cout <<"键值为:" << it->first << "  ";cout <<"key值为:" <<it->second ;cout << endl;}}
void test01()
{	//默认函数构造map<int, int,d> d1;d1.insert(pair<int, int>(2, 32));d1.insert(pair<int, int>(5, 62));d1.insert(pair<int, int>(3, 22));d1.insert(pair<int, int>(7, 72));cout << "默认函数构造结果为:"<<endl;printa(d1);}
int main()
{test01();
}

运行结果:

📖通过仿函数实现自定义排序,我们使得键值的排序规则变为了由大到小。

🤔multimap:

📖multimap是C++ STL库中的一个关联式容器,用于存储键-值对,允许一个键对应多个值(即一个键可以在容器中有多个值)。与map容器不同的是,multimap允许一个键对应多个值,而map只允许一个键对应一个值。

📖multimap的内部实现基于红黑树,以键值来快速查找容器中的元素,元素按照键由小到大进行排序。

📖multimap与map容器相似,提供了一些成员函数来方便地访问和操作容器中的元素,如insert()、erase()、find()等函数。此外,multimap还支持同时使用多个键来查找元素,并支持按范围查找元素。

📖multimap容器适合存储一个键对应多个值的情况,例如在实现简单数据库的时候,可以使用multimap来存储数据库中的键值对,键可以是列名,值可以是该列下的所有值。

🙂特点:

multimap容器的特点如下:

📖1. 一个键可以对应多个值,即允许重复的key和value。

📖2. 它是一个关联式容器,内部使用红黑树实现,保证了元素的快速查找和排序。

📖3. 提供了一系列方法来访问和操作元素,如insert()、erase()、find()等函数。

📖4. 可以按范围查找元素,支持同时使用多个键查找元素。

📖5. 与其他容器相比,multimap容器内部的复杂度与元素个数和键值对数量无关,而与树高相关,保证了处理大量元素时的高效性。

📖6. 不支持使用[]访问元素。

multimap的主要优点在于,可以方便地存储一对多的键值对关系,且内部使用的红黑树可以实现元素的快速查找和按键排序。然而,由于支持重复的key和value,可能会导致一些插入和查找操作变得复杂,因此在使用时需要注意。

代码示例:

#include<iostream>
using namespace std;
#include<map>
class d
{
public:bool operator()(int v1, int v2)const{return v1 > v2;}
};
void printa(const multimap<int,int,d>& d)
{for (auto it = d.begin(); it != d.end(); it++){cout <<"键值为:" << it->first << "  ";cout <<"key值为:" <<it->second;cout << endl;}}
void test01()
{	//默认函数构造multimap<int, int,d> d1;d1.insert(pair<int, int>(2, 32));d1.insert(pair<int, int>(5, 62));d1.insert(pair<int, int>(3, 22));d1.insert(pair<int, int>(3, 23));d1.insert(pair<int, int>(7, 72));cout << "默认函数构造结果为:"<<endl;printa(d1);}
int main()
{test01();
}

运行结果:

 由此我们可以看出multimap可以存储键值相同的元素。

🙂multimap与map的区别:

multimap和map本质上都是关联式容器,以键值对存储元素,且键值不能重复,但在插入元素时有些许不同:

📖map容器要求元素的键值必须唯一,若元素已经存在,则插入失败。

📖multimap容器允许元素的键值重复,可以插入多个具有相同键值的元素。
 

在使用迭代器访问容器元素时,它们也稍有不同:

📖在map容器中,每个元素都是一个键值对,通过迭代器访问时,迭代器的指针所指向的是一个pair类型的变量,该变量包含两个成员变量:first表示键,second表示值。

📖在multimap容器中,每个元素也是一个键值对,但是可以包含重复的键值,通过迭代器访问时,迭代器的指针所指向的是一个pair类型的指针或引用,这是因为对于一个键值来说,可能存在多个值。

此外,由于multimap容器允许元素键值重复,因此在删除元素时需要注意,由于删除操作只会删除一个键值对,因此如果要删除多个键值相同的元素,需要结合find()函数一起使用来实现。而对于map容器而言,由于元素键值唯一,可以通过关键字直接删除元素,操作比较简单

🤔结束!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/254800.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

深度剖析 Vue.js 经典知识点之:SPA、SSR与MVVM

SPA 更多精彩内容&#xff0c;请微信搜索“前端爱好者“&#xff0c; 戳我 查看 。‘ 谈一谈你对 SPA 单⻚面的理解&#xff0c;它的优缺点分别是什么 SPA&#xff08; single-page application &#xff09;仅在 Web ⻚面初始化时加载相应的 HTML、JavaScript 和 CSS。 一旦…

天敏G10数位板安装完PS无压感,观看此教程

1.拿到数位板&#xff0c;先把usb线路插入到电脑 ps.插入电脑usb,台式机请使用后置面板&#xff0c;这样供电稳定。 2.安装驱动 PS.驱动都是无盘驱动&#xff0c;驱动在我的电脑&#xff0c;一个移动盘符中&#xff0c;找到直接安装即可 3.安装完桌面会有一个图标&#xff…

ps打开笔压仍没有效果

打开钢笔压感但是ps依旧没有笔压 ①在此电脑搜索框中搜索&#xff1a; %appdata%\Adobe 然后打开Adobe Photoshop CC 2019 Settings ②创建文本 PSUserConfig 如下图所示&#xff1a; 这是PSUserConfig文本中的内容 # Use WinTabUseSystemStylus 0 ③然后再次打开ps尝试。 …

每天一个小技巧【5】·数位板笔刷压感设置

虽然是个程序员&#xff0c;但是感觉还是需要个数位板&#xff0c;比如可以做笔记、绘制光学路径、分析运动和受力过程、公式计算&#xff0c;或者放松时涂个鸦。&#xff08;虽然感觉ipad苹果笔或许更合适&#xff09; 我的数位板是有压感功能的&#xff0c;但想要在PS中让笔…

在web上实现压感

先放结论&#xff1a;结论是可以成功获得压感&#xff0c;可行。具体方案可以见文章末尾。 想着做一款带压感的在线绘图工具。首当其冲的问题就是web无法获取到数位板的压感数值。 查询了知乎、百度、google&#xff0c;得到了一下集中方案&#xff1a; 1. pressurejs.com 这…

ps cutterman点击没有反应

ps cutterman点击没有反应,解决办法&#xff1a;http://www.cutterman.cn/zh/faq PS:如果不行&#xff0c;把上面打开的文件夹全部的cutterman删除&#xff0c;重新安装

WIN10系统下PS软件卡顿问题的解决方法

WIN10系统下PS软件手绘板卡顿问题的解决方法 问题的状况问题来源解决方法备注 问题的状况 在win10系统下&#xff1a; 1. 使用手绘板在PS中画画时会弹出Win Ink的小键盘或者其他 2. 不定时卡顿 3. 丢失指针&#xff0c;取消选中图层 4. 滑动过程中中断&#xff0c;在图上留下…

Redis高级篇 - 多级缓存

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; 请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时…

如何在线剪辑视频?手机视频怎样剪辑?

在这个短视频当道的时代&#xff0c;大家都开始随手录制视频记录生活&#xff0c;一个视频从录制到发布&#xff0c;中间不可缺少的环节就是对视频的剪辑&#xff0c;想要做出高质量的视频&#xff0c;就少不了要在视频剪辑这一方面下功夫。 有视频剪辑经验的小伙伴自然会选择使…

视频快速剪辑分享

优酷视频格式转码比较慢&#xff0c;剪辑视频时长比较大时 可以采取一种比较懒的方式对视频进行快速剪辑 1.下载 EV录屏&#xff0c;并进行设置 2.进入设置&#xff0c;修改录制倒计时时间&#xff0c;并记住快捷键&#xff0c;默认快捷键为Ctrl F1 3.将待剪辑视频放置在录制…

屏幕录制和视频剪辑Filmage Screen

Filmage Screen是Mac上的一款比较专业的录屏软件&#xff0c;可以一键录制高清的视频&#xff0c;可以选择全屏录制&#xff0c;也可以选择自定义屏幕&#xff0c;Filmage Screen拥有内置的相机&#xff0c;可以创建清晰的影片&#xff0c;Filmage Screen具有视频编辑功能&…

极简视频录制/剪辑工具-Camtasia Studio9

由于疫情影响&#xff0c;许多会议、课程、毕业答辩等工作均设为线上&#xff0c;有时课程可能没有回放&#xff0c;或是会议领导的总结发言等可能需要反复观看&#xff0c;又或是毕业季的网上答辩&#xff0c;学生生涯中一次美好的回忆&#xff0c;将其记录下来日后观看&#…

电脑录屏怎么录?3个方法,教你如何录制视频

电脑录屏是可以通过录制视频的方式进行记录下我们的操作过程&#xff0c;并且可以随时保存下来方便以后查阅使用。大家都知道&#xff0c;电脑录屏是非常实用的&#xff0c;能够帮助我们记录屏幕上的内容&#xff0c;而且还能保存下来&#xff0c;以便我们以后的电脑学习使用。…

android系统视频剪辑app推荐,知乎10w人收藏:玩短视频必装的9款剪辑App(最全)...

声明:本文来自于微信公众号 微果酱(ID:wjam123456),作者: 橙子,授权站长之家转载发布。 做运营的 每天都要面临一些新难题 比如老板想追潮流做短视频 吐血写脚本、拍完视频 磨刀霍霍向猪羊准备剪视频 打开电脑剪辑软件发现,为何如此复杂 滤镜怎么加?调色怎么办?特效怎…

Camtasia视频剪辑功能详解

Camtasia是一款备受好评的屏幕录制软件&#xff0c;其中一个非常好用的功能就是视频剪辑&#xff0c;其视频剪辑功能的初衷是为了方便用户在录制视频后直接对视频文件进行编辑&#xff0c;而后也可以将其他视频导入Camtasia进行编辑&#xff0c;正因如此&#xff0c;Camtasia令…

录制和剪辑视频,如何解决占用空间过大的问题?

题图&#xff1a;用 OpenAI DALLE 绘制。prompts: a big movie tape in the crowded lighting room 问题 最近做视频比较多。我一般采用手机录制&#xff0c;然后加上 B-roll 素材进行剪辑。录制 8-10 分钟的视频&#xff0c;大概能有 1GB 左右的体积&#xff0c;输出后的视频也…

学术会议演讲视频录制全方位指南

1. 引言 随着进入后疫情时代&#xff0c;在线学术会议愈发频繁。从CCF-A类会议到C类会议&#xff0c;基本上都需要做线上的Oral。 一般的要求就是录制一个15分钟左右的Presentation&#xff0c;然后上传至网站即可。有些会议还贴心的准备了加载字幕的功能&#xff0c;我们的英…

3-网络初识——协议

目录 1.概念 ①语法&#xff1a;即数据与控制信息的结构或格式。 ②语义&#xff1a;即需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应。 ③时序&#xff1a;即事件实现顺序的详细说明。 2.作用 3.知名协议的默认端口 4.协议分层 4.1.什么是协议分层 …

我是如何录制技术视频教程的?

今天这篇文章为大家分享一下本人录制技术教学视频的一些经验。这样的经验可能很难在网上找到这么全的。 如果你正在录制视频教程&#xff0c;希望能对你有新的启发&#xff1b;如果你还未录制过视频教程&#xff0c;看完之后要么获取经验&#xff0c;要么考虑是否入行。如果你…

计算机录制视频的方法,怎么录制电脑屏幕视频步骤(电脑录屏的方法有4种)...

电脑录屏的方法有4种&#xff0c;一键开启很简单&#xff0c;大家都来学一学 如果你想要和我一样&#xff0c;想要进行一些电脑屏幕步骤的操作&#xff0c;想要把屏幕录制下来&#xff0c;这时候很多人就会选择使用QQ自带的录屏功能&#xff0c;其实除了QQ录屏&#xff0c;电脑…