用法 stl_C++STL 容器篇

b40e3bdba067450515bb291bfde2b5f5.gif

4362ee00961851dfd0b3b51d987c8ca5.png

前言

上一章节主要是详细介绍了C++泛型编程基础,不清楚的可以回顾一下哦。本章节主要针对于C++STL(标准模板类库)做个详细介绍。标准模板类库也就是别人写的模板类,主要内容是各种数据结构的封装,以及常用算法。暂时分三个章节介绍,本章节主要介绍容器篇。

4362ee00961851dfd0b3b51d987c8ca5.png

容器总括

序列式容器(sequence containers)

  • array(c++11以上版本) : 定长数组。

  • vector : 动态数组。

  • vector : vector的bool特化。

  • forward_list(c++11以上版本) : 单链表。

  • list :双向链表。

  • deque:双端动态数组。

关联式容器(associative containers)

  • set(multiset) : 有序集合,键和值相同。

  • map(multimap) : 有序集合,键对应值。

哈希表(hash table) (c++11以上版本)

  • unordered_set(unordered_multiset)(c++11以上版本: 无序集合,key == value, 特性与unordered_map类似

  • unordered_map(unordered_multimap)(c++11以上版本: 无序集合,单独访问某个元素较快,从头到尾遍历效率会低于map

容器适配器(container adapters)

  • stack : 栈

  • queue : 队列

  • priority_queue : 优先队列

  • bitset : 位组

本章节主要介绍以下几种容器的基本用法:

f4c9d444c4b9f58c49aee19ef41a05ba.png

4362ee00961851dfd0b3b51d987c8ca5.png

适配器容器

因为这些容器都是基于其他标准容器实现的所以叫做容器的适配器,具体的有stack,queue,priority_queue,默认的情况下,stack和queue基于deque而实现的,priority_queue在vector上实现的,可以根据第二个实参指定容器的类型,但一定要符合标准,queue要求要有push_front操作因此不能建立在vector上面,priority_front要求有随机访问的功能,因此建立在vector上面。优先级队列默认情况下是大顶堆,也就是大者优先级高,后面可以自定义优先级比较规则,当然这些东西大家了解一下即可,更多是掌握这些适配器容器的使用。

1stack容器

stack是栈结构,栈是一种FILO(先进后出)结构,从容器中拿数据必须按照FILO的方式。stack主要成员函数有以下几个:

  1. empty():栈为空则返回真

  2. pop(): 移除栈顶元素

  3. push(): 在栈顶增加元素

  4. size(): 返回栈中元素数目

  5. top(): 返回栈顶元素

使用实例代码如下:求解一个数字的二进制

17c795414b8d4e0a83d7afb51f9ec591.png

2queue容器

queue是队列结构,队列是一种FIFO(先进先出)结构,从容器中拿数据必须按照FIFO的方式。queue主要成员函数有以下几个:

  1. empty():队列为空则返回真

  2. pop(): 移除队头元素

  3. push(): 在队尾增加元素

  4. size(): 返回队中元素数目

  5. front(): 返回队头元素

使用实例代码如下:描述点赞,转发,评论 三连操作

99083c1f121c5f60984759d95db46648.png

3priority_queue容器

priority_queue是优先队列,一般我们都需要自己重写比较准则,相对于上面两种容器来说稍微麻烦一点。优先队列具有队列的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。主要成员函数和queue基本差不多,主要有以下几个:

  1. top():访问队头元素

  2. empty():队列是否为空

  3. size(): 返回队列内元素个数

  4. push(): 插入元素到队尾 (并排序)

  5. emplace(): 原地构造一个元素并插入队列

  6. pop(): 弹出队头元素

  7. swap():交换内容

优先队列主要用来做大顶堆和小顶堆使用,因为出队是根据优先权去出队的。案例代码如下:

cc718cb666fdd9963d85896b972c891d.png

priority_queue , greater >

int: 操作的数据类型

vector: 操作的容器

greater: 比较准则 大于 

在优先队列操作自定义类型的时候通常是重写比较准则来实现排序效果。这个一定要注意。

4362ee00961851dfd0b3b51d987c8ca5.png

序列式容器

所谓序列容器,即以线性排列(类似普通数组的存储方式)来存储某一指定类型(例如 int、double 等)的数据,需要特殊说明的是,该类容器并不会自动对存储的元素按照值的大小进行排序。需要注意的是,序列容器只是一类容器的统称,并不指具体的某个容器,本文序列式容器只介绍array,vector,以及list。

1array容器

array是定长数组,此类容器一旦建立,其长度就是固定不变的,这意味着不能增加或删除元素,只能改变某个元素的值,案例代码如下:

688655e564294ece9bbca183cd98768b.png

2vector容器

vector是动态数组,在没有确定数组长度的时候,不能采用下标法进行插入元素,只能采用push_back的成员函数进行插入元素,vector常用成员函数如下:

  1. assign(beg,end):赋值区间[beg,end]元素到容器

  2. assign(n,elem):n个elem复制到容器

  3. at(index): 访问index序号的元素

  4. clear(): 清除容器中的元素

  5. erase(index): 删除index序号的元素

  6. empty(): 判断容器是否为空

  7. push_back(elem):尾部插入元素elem

  8. size():容器元素个数

  9. back():容器最后一个元素

动态数组vector和数组类似,并不是很复杂,案例代码如下:

749839879d9a12633e30ab7ded418520.png

3list容器

list容器是双向链表,类似于C语言中写的双向链表,操作很简单,常用成员函数如下:

  1. front():链表头部元素

  2. back():链表尾部元素

  3. size(): 链表中元素个数

  4. empty(): 链表是否为空

  5. push_back(elem): 尾插法

  6. push_front(elem): 头插法

  7. pop_back:尾删法

  8. pop_front(): 头插法

  9. insert(iter): 指定位置插入

  10. erase(iter):指定位置删除

  11. merage(list): 合并

  12. sort():排序

  13. assign(beg,end):区间 [beg,end]元素复制到链表

list的使用基本和自己的些的链表使用差不多,只是函数已被封装。如下案例:

d1f90c026d840eb0239a578a792b08ad.png

4362ee00961851dfd0b3b51d987c8ca5.png

关联式容器

关联式容器存储的元素,都是一个一个的“键值对”( ),这是和序列式容器最大的不同。除此之外,序列式容器中存储的元素默认都是未经过排序的,而使用关联式容器存储的元素,默认会根据各元素的键值的大小做升序排序。关联式容器所具备的这些特性,归咎于 STL 标准库在实现该类型容器时,底层选用了 红黑树这种数据结构来组织和存储各个键值对。

1set容器

set容器可以理解为集合,对于set集合一般是key和value是相等的,所以存储的数据没有对应的关系,存储的数据一般是有序的,对于set来说还有相对应的多重集合 multiset,set集合不允许重复的数据,multiset允许重复的数据,它们使用的成员函数基本是差不多的。主要成员函数如下:

  1. insert(elem):插入elem

  2. begin():容器开始位置

  3. end(): 容器结束位置

  4. size(): 容器中元素个数

  5. erase(iter): 删除容器中iter指向的元素

对于set集合插入元素后会自带排序功能,默认排序方式是从小到大, 可以通过修改排序准则调整排序方式。set> object,构造集合对象的时候加入排序准则即可,或者重写也可以。集合测试案例代码如下:

a0a7774944e789cefcf8a0c71d154b18.png

2map容器

map容器可以理解为单映射,操作的数据类型是数对类型,即pair类型,pair数据有两个成员 first(键)和second(值),而map的排序是根据键排序的。同样也存在多重映射,区别在于多重映射允许相同的键的数据存在。而单映射不允许。数组其实可以理解为下标与值的对应关系,而映射是是拓展版的下标对应值的关系,因为它不局限于整数的键。对于映射常用成员函数如下:

  1. insert(pairelem):插入数对elem

  2. begin():容器开始位置

  3. end(): 容器结束位置

  4. size(): 容器中元素个数

  5. erase(iter): 删除元素

在单映射中可以采用数组形态方式进行插入元素,但是多重映射不允许的,案例代码如下:

d6efb46405b6742123351593c2f30e79.png

尾言

本栏目到这里结束了,关于迭代器内容我们单独一章节讲解,作业:采用STL去操作自定义类型数据。难度不大,重在重载。

aa62a2e37b66dd426e0c98790ace501c.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超级强大的 vim 配置(vimplus)

From : http://www.cnblogs.com/highway-9/p/5984285.html From : http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html From : http://www.cnblogs.com/youxia/p/linux002.html From : http://blog.csdn.net/namecyf/article/details/7787479 最近在重新配置Vim&a…

谷歌将屏蔽一切与加密货币相关的广告 6月正式生效

来源:腾讯证券北京时间3月14日下午消息,据外媒报道,谷歌开始对与加密货币相关的广告的进行打击。谷歌可持续广告业务负责人斯科特-斯宾塞(Scott Spencer)在接受CNBC采访时称,该公司正在调整与金融服务相关的…

ARM体系结构与汇编指令

可编程器件的特点 • CPU在固定频率的时钟控制下节奏运行。 • CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行。 • 这些可以被CPU解码执行的二进制指令集是CPU设计的时候确定的,是CPU的设计者(ARM公司)定义的&a…

微软宣布在机器翻译方面取得突破,中翻英可达人类水平

来源:猎云网一组微软研究团队于本周三宣布,他们已经创造了第一个能够将中文新闻翻译成英文的机器翻译系统,精确度与人类译者一致。该公司表示,它通过来自各种在线报纸的约2000条语句样本对这一系统进行了反复测试,并将…

pla3d打印材料密度_3D打印金属材料模型过程中常见问题

在金属3D打印过程中,可能会出现大量设备操作者试图避免的问题,包括孔隙、残余应力、致密度、翘曲、裂纹及表面光洁度等。下面我们来谈谈这几种常出现的问题。1、表面光洁度在金属3D打印件被使用或放置在展柜之前,它已经经历了大量类似CNC加工…

Java并发编程实战~ThreadLocal

ThreadLocal 的使用方法 static class SafeDateFormat {// 定义 ThreadLocal 变量static final ThreadLocal<DateFormat>tl ThreadLocal.withInitial(()-> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));static DateFormat get(){return tl.get();} }// …

智慧停车介绍、产业链市场全透析

来源&#xff1a;传感器技术最近&#xff0c;Goodwin调查发现&#xff0c;在城市地区&#xff0c;接近30%的交通拥堵源自于司机寻找停车位。据称&#xff0c;到2020年&#xff0c;将会有20亿的汽车在公路上跑着&#xff0c;这就意味着&#xff0c;届时汽车的数量将比目前多了7.…

Python 下载 图片、音乐、视频 和 断点续传

Python3 使用 requests 模块显示下载进度: http://blog.csdn.net/supercooly/article/details/51046561 python编写断点续传下载软件&#xff1a;https://www.leavesongs.com/PYTHON/resume-download-from-break-point-tool-by-python.html Python实现下载界面(带进度条&…

10停止nginx命令 win_Linux下配置Nginx并使用https协议

环境Centos7.6nginx-1.17.0下载官网&#xff1a;http://nginx.org/download/nginx-1.17.0.tar.gz环境确认在安装nginx前首先要确认系统中是否安装gcc、pcre-devel、zlib-devel、openssl-devel检查是否安装过软件包yum list installed | grep xxx安装软件包yum -y install gcc p…

腾讯AI Lab发布三大核心战略,与自然科研达成战略合作

来源&#xff1a;腾讯AI实验室3月15日&#xff0c;腾讯AI Lab第二届学术论坛在深圳举行&#xff0c;聚焦人工智能在医疗、游戏、多媒体内容、人机交互等四大领域的跨界研究与应用。全球30位顶级AI专家出席&#xff0c;对多项前沿研究成果进行了深入探讨与交流。本次论坛以“共享…

Java并发编程实战~Guarded Suspension模式

Guarded Suspension 模式 比如&#xff0c;项目组团建要外出聚餐&#xff0c;我们提前预订了一个包间&#xff0c;然后兴冲冲地奔过去&#xff0c;到那儿后大堂经理看了一眼包间&#xff0c;发现服务员正在收拾&#xff0c;就会告诉我们&#xff1a;“您预订的包间服务员正在收…

diy直立双足机器人_Aelos Pro 机器人:让编程变得更有趣

前言拥有一台酷炫的机器人是每个人儿时的梦想&#xff0c;爱搞机最近也有机会拿到一款来自乐聚的新品&#xff1a; Aelos Pro 机器人。相信有了解过机器人的朋友&#xff0c;应该对乐聚有所耳闻&#xff0c;乐聚在人形机器人领域一直都是行业的佼佼者&#xff0c;Aelos 系列机器…

中国科学家首次解析人脑“中央处理器”,领先美国脑计划

来源&#xff1a;澎湃新闻 作者&#xff1a;贺梨萍“我们可以探索数光年外的宇宙&#xff0c;但对我们两耳之间3磅重的大脑知之甚少。”这一想法推动美国前任总统奥巴马启动了“推进创新神经技术脑研究计划”&#xff0c;也就是所谓的 “脑计划”。中国同一领域内的研究也在加…

物理拓扑和逻辑拓扑——现实和应用的比较

在每一个网络管理者的脑子里几乎都有一张自己所管理的网络拓扑图。在网管系统中&#xff0c;生成拓扑图是网管系统的基本功能之一。目前&#xff0c;在网管系统中生成的的拓扑图分为物理拓扑和逻辑拓扑&#xff0c;他们有什么不同呢&#xff1f; 作为网络的管理者我们知道&…

虚拟机无法接受组播消息_IPTV(组播)骨干网完整解决方案--四川广电网络

一&#xff0c;基于ANYCAST 设计骨干RP热备1&#xff0c;RP选举说明组播网络RP设置分为动态&#xff0c;静态2种。但和很多网络协议不一样&#xff0c;RP的选择默认是动态优先。也就是在路由器上同时存在动态和静态RP的时候会优选动态&#xff0c;除非定义强制静态优选动态才不…

Java并发编程实战~Worker Thread模式

在上一篇文章中&#xff0c;我们介绍了一种最简单的分工模式——Thread-Per-Message 模式&#xff0c;对应到现实世界&#xff0c;其实就是委托代办。这种分工模式如果用 Java Thread 实现&#xff0c;频繁地创建、销毁线程非常影响性能&#xff0c;同时无限制地创建线程还可能…

DES算法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、DES是什么&#xff1f;二、go语言实现1.使用CBC模式1.使用ECB模式前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、DES是什…

2018年世界前沿科技趋势展望及2017年态势总结

来源&#xff1a;全球技术地图本文以智能制造、新材料和信息三大领域为例&#xff0c;深入浅出的探讨了2017年以来世界前沿科技的发展脉络&#xff0c;并对2018年可能的走势进行了预测。-智能制造领域-2017年态势总结多国推出新举措&#xff0c;推动先进制造发展美国成立白宫贸…

写给女友的情诗

亲爱抱抱每次看到你很快乐的样子总是让我无比欢畅你让我看到幸福 让我看到阳光彼此的那份甜蜜只有你我才能感觉得到你让我忘掉悠愁 让我忘掉烦恼你就是我最闪亮的星星亲爱的让我紧紧的抱抱每次都是那么地不一样无论如何我还是喜欢这样抱着你直到永远Hei Baby You are my favori…

机器人3·15 | 赛迪「机器人国评中心」揭示机器人产品质量6大痛点!

来源&#xff1a;雷克世界机器人是“制造业皇冠顶端的明珠”&#xff0c;其研发、制造、应用是衡量一个国家科技创新和高端制造业水平的重要标志。当前&#xff0c;我国机器人市场进入高速增长期&#xff0c;“机器换人”浪潮势不可挡&#xff0c;产品应用层见叠出&#xff0c;…