用法 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采访时称,该公司正在调整与金融服务相关的…

Java并发编程实战~Copy-on-Write模式

Copy-on-Write 模式的应用领域 1、在操作系统领域。类 Unix 的操作系统中创建进程的 API 是 fork(),传统的 fork() 函数会创建父进程的一个完整副本 2、很多文件系统也同样用到了,例如 Btrfs (B-Tree File System)、aufs(advanced multi-la…

[导入]身份验证方面的问题

目前再研究Discuz !NT 1.0源码发现它Web.config中设置,为什么不用Form方式,有谁能说说?文章来源:http://topic.csdn.net/u/20080828/11/051abbea-ba95-466d-afcd-82bbb0f647e3.html转载于:https://www.cnblogs.com/zengxlf/articles/1279232.html

ARM体系结构与汇编指令

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

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

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

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

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

GPID和LED

笔记源自《朱老师物联网大讲堂》 《1.4.ARM裸机第四部分-GPIO和LED》 第一部分、章节目录 1.4.1.裸机实验体验之usb启动配合dnw工具下载 1.4.2.裸机实验体验之SD卡下载 1.4.3.自己动手安装交叉编译工具链1 1.4.4.自己动手安装交叉编译工具链2 1.4.5.Makefile大侠隆重登场 1.4…

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实现下载界面(带进度条&…

.NET Framework 2.0新增特性总结

下午闲着无聊&#xff0c;翻了翻很久之前买的书籍&#xff0c;看了一下dotNetFramework2.0后添加的特性&#xff0c;包括以下几点&#xff1a; 代码段。这个功能很早就知道了&#xff0c;Framework已经提供了很多代码段&#xff0c;我们也可以自定义代码段&#xff0c;不过之前…

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…

s5pv210开发板、原理图、刷机和数据手册

笔记源自《朱老师物联网大讲堂》 《1.3.ARM裸机第三部分-开发板、原理图和数据手册》 第一部分、章节目录 1.3.1.开发板和光盘资料简介 1.3.2.开发板硬件手册带读 1.3.3.开发板刷系统1 1.3.4.开发板刷系统2 1.3.5.开发板刷系统3 1.3.6.X210核心板、底板原理图导读1 1.3.7.X21…

腾讯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;“您预订的包间服务员正在收…

C 和 C++字符串详解

From&#xff1a;http://blog.csdn.net/fenxinzi557/article/details/51457829 From&#xff1a;http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html C之string类型详解&#xff1a;http://citycowboy.blog.sohu.com/50058804.html -------------------------…

Oracle函数大全1

1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(’A’) A,ascii(’a’) a,ascii(’0’) zero,ascii(’ ’) space from dual; A A ZERO SPACE --------- --------- --------- --------- 65 97 48 32 2.CHR 给出整数,返…

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

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

uboot学习前传

笔记源自《朱老师物联网大讲堂》 《2.uboot和系统移植-第1部分-2.1.uboot学习前传》 第一部分、章节目录 2.1.1.为什么要有uboot 2.1.2.为什么是uboot 2.1.3.uboot必须解决哪些问题 2.1.4.uboot的工作方式 2.1.5.uboot的常用命令1 2.1.6.uboot的常用命令2 2.1.7.开发板和主机的…