【C++】STL --- 概论和三大组件
【C++】STL --- 概论和三大组件
- 一. 概论
- 1. STL基本概念
- 2. STL六大组件简介
- 3. STL优点
- 二. STL三大组件
- 1. 容器
- 2. 算法
- 3. 迭代器
一. 概论
1. STL基本概念
STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统称。现在主要出现在 c++中,但是在引入 c++之前该技术已经存在很长时间了。
STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。STL(Standard Template Library)标准模板库,在我们 c++标准程序库中隶属于 STL 的占到了 80%以上。
2. STL六大组件简介
STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。
- 容器:
各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。 - 算法:
各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte. - 迭代器:
扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。 - 仿函数:
行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template - 适配器:
一种用来修饰容器或者仿函数或迭代器接口的东西。 - 空间配置器:
负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.
STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。
3. STL优点
- STL 是 C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
- STL 的一个重要特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作
- 程序员可以不用思考 STL 具体的实现过程,只要能够熟练使用 STL 就 OK 了。这样他们就可以把精力放在程序开发的别的方面。
- STL 具有高可重用性,高性能,高移植性,跨平台的优点。
- 高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。关于模板的知
识,已经给大家介绍了。 - 高性能:如 map 可以高效地从十万条记录里面查找出指定的记录,因为 map 是采用红黑树的变体实现的。
- 高移植性:如在项目 A 上用 STL 编写的模块,可以直接移植到项目 B 上。
- 高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。关于模板的知
二. STL三大组件
1. 容器
- 容器,置物之所也。
研究数据的特定排列方式,以利于搜索或排序或其他特殊目的,这一门学科我们称为数据结构。大学信息类相关专业里面,与编程最有直接关系的学科,首推数据结构与算法。几乎可以说,任何特定的数据结构都是为了实现某种特定的算法。STL容器就是将运用最广泛的一些数据结构实现出来。
常用的数据结构:数组(array),链表(list),tree(树),栈(stack),队列(queue),集合(set),映射表(map),根据数据在容器中的排列特性,这些数据分为序列式容器和关联式容器两种。
- 序列式容器强调值的排序,序列式容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。Vector容器、Deque容器、List容器等。
- 关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。关联式容器另一个显著特点是:在值中选择一个值作为关键字key,这个关键字对值起到索引的作用,方便查找。Set/multiset容器 Map/multimap容器
2. 算法
- 算法,问题之解法也。
以有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms).
广义而言,我们所编写的每个程序都是一个算法,其中的每个函数也都是一个算法,毕竟它们都是用来解决或大或小的逻辑问题或数学问题。STL收录的算法经过了数学上的效能分析与证明,是极具复用价值的,包括常用的排序,查找等等。特定的算法往往搭配特定的数据结构,算法与数据结构相辅相成。
算法分为:质变算法和非质变算法。
- 质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
- 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等
再好的编程技巧,也无法让一个笨拙的算法起死回生。
3. 迭代器
迭代器(iterator)是一种抽象的设计概念,现实程序语言中并没有直接对应于这个概念的实物。在<>一书中提供了23中设计模式的完整描述,其中iterator模式定义如下:提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。
迭代器的设计思维-STL的关键所在,STL的中心思想在于将容器(container)和算法(algorithms)分开,彼此独立设计,最后再一贴胶着剂将他们撮合在一起。从技术角度来看,容器和算法的泛型化并不困难,c++的class template和function template可分别达到目标,如果设计出两这个之间的良好的胶着剂,才是大难题。
- 迭代器的种类
输入迭代器 | 提供对数据的只读访问 | 只读,支持++、==、!= |
---|---|---|
输出迭代器 | 提供对数据的只写访问 | 只写,支持++ |
前向迭代器 | 提供读写操作,并能向前推进迭代器 读写 | 支持++、==、!= |
双向迭代器 | 提供读写操作,并能向前和向后操作 | 读写,支持++、– |
随机访问迭代器 | 提供读写操作,并能以跳跃的方式访问容器的任意数据,是功能最强的迭代器 读写 | 支持++、–、[n]、-n、<、<=、>、>= |
【C++】STL --- 概论和三大组件相关推荐
- STL源码剖析-第一章STL概论与版本简介
系列文章目录 第一章:STL概论与版本简介 文章目录 系列文章目录 前言 一.STL是什么? 二.STL六大组件 1.引入库 前言 源码之前 了无秘密 这本书不适合C++ 初学者,不适合 Generi ...
- 2021年大数据Hadoop(二十六):YARN三大组件介绍
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn三大组件介绍 ResourceManager No ...
- java web三大组件之filter过滤器
过滤器是java web中相当重要的组成成分,是JavaWeb三大组件之一,它与Servlet很相似.不过过滤器有以下三条特性: 过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servle ...
- 三大组件与三大优势 SUSE发布CaaS平台为哪般?
在当下,容器技术的热度不亚于夏日的骄阳.容器技术正在创新应用程序的开发和运行方式,然而各大企业并不想自己安装和维护设置复杂.安全性要求又高的容器基础架构,而是把精力集中在那些可为其业务带来价值的应用程 ...
- 第一章 java nio三大组件与使用姿势
本案例来源于<netty权威指南> 一.三大组件 Selector:多路复用器.轮询注册在其上的Channel,当发现某个或者多个Channel处于"就绪状态"后(ac ...
- JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)
JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference 转载于:https://www.cnblogs.com/Jeremy2001 ...
- 【Netty】NIO 简介 ( NIO 模型 | NIO 三大组件 | 选择器 Selector | 通道 Channel | 缓冲区 Buffer | NIO 组件分配 | 缓冲区示例 )
文章目录 I . NIO 模型 II . NIO 三大组件交互流程 III . NIO 缓冲区 IV . NIO 与 BIO 对比 V . NIO 线程分配 VI . 缓冲区 ( Buffer ) 示 ...
- java怎么监听多个组件,java web(五):java web三大组件之另外两个和八大监听器
java的三大组件指Servlet.Filter.Listener.八大监听器指八个接口.前面介绍了Servlet,现在介绍一下Filter拦截器以及拦截地址的设置, Listener监听那些事件. ...
- Web三大组件的注册——Servlet、Filter、Listener(监听三大作用域: ServletContext、HttpSession、ServletRequest )
Web三大组件的注册 Servlet @WebServlet("/user.action") <servlet> </servlet> <servle ...
最新文章
- Java项目:在线美食网站系统(java+SSM+jsp+mysql+maven)
- python的try菜鸟_python异常处理try except过程解析
- 上下定高 中间自适应_联合首发|医药供应链平台一块医药获新一轮融资,赋能产业上下游提质增效...
- server日期函数
- spring boot 日志文件配置(logback-spring.xml)亲测可用!
- 使用swipecard实现卡片视图左右滑动监听以及点击监听
- eclipse--eclipse(JavaEE版本)部署Tomcat工程(转)
- B站发布51部国创作品新内容 公布《三体》动画新PV
- JAVA基础系列:Arrays.sort()
- python编程语言解析_【笔记】Python之解析式详解
- ppt转html5 带动画_天府味道 小吃龙门阵____糖饼糖画 难以忘怀的童年趣味
- BZOJ2303 APIO2011方格染色(并查集)
- Java 静态模块和构造方法
- Atitit webdav 的问题 -------------大文件传输问题 在某些版本的 Windows 操作系统中,WebDAV 驱动器的最大文件大小被限制为 50MB。如果你试图复制超过 5
- 【华南理工大学】PC客户端配置-如何在家连接学校的校园网
- 公司估值与财务分析指标
- java常量池在哪里_【Java基础】Java常量池在哪里? - 收获啦
- Linux之计划任务
- SQL Server常用函数整理
- (2021)建筑能耗模拟的灰箱建模与应用——综述