STL 第一篇 初识STL
STL
- 什么是STL
- STL组成--六大组件
- 组件一:容器
- 容器分类
- 组件二:空间配置器(alloctor)
- 组件三--算法
- 组件4--迭代器
- 什么是迭代器
- 常见的迭代器
- 组件五---仿函数 另名:函数对象
- 什么是仿函数
- 仿函数的示例
- 组件六 ---- 配接器(适配器)
- 什么是配接器
- 使用
什么是STL
STL,本质上为一个程序库。
目的:为了复用性的提升
为了建立数据结构和算法的一套标准,并且降低其间的耦合关系,以提升自身的独立性、弹性、交互性操作(相互合作性),STL得以诞生。
STL价值:
一方面。就低层次而言,STL带给我们一套具有实用价值的零部件,以及一个整合的组织。。
另一方面,STL还给我们带来一个高层次的,以泛性思维为基础的,系统化的、条理分明的“软件组件分类学‘。从这个角度来看,STL是一个抽象概念库。
STL组成–六大组件
组件一:容器
概念: 在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法。
容器分类
组件二:空间配置器(alloctor)
为什么要提出空间配置器这个概念?
1.小块内存会带来内存碎片问题
如果任由STL中的容器自行通过malloc分配内存,那么频繁的分配和释放内存会导致堆中有很多的外部碎片。可能堆中的所有空闲空间之和很大,但当申请新的内存的请求到来时,没有足够大的连续内存可以分配,这将导致内存分配失败。因此这样会导致内存浪费。
2.小块内存的频繁申请释放会带来性能问题
开辟空间的时候,分配器需要时间去寻找空闲块,找到空闲块之后才能分配给用户。而如果分配器找不到足够大的空闲块可能还需要考虑处理加碎片现象(释放的小块空间没有合并),这时候需要花时间去合并已经释放了的内存空间块。
而且malloc在开辟内存空间的时候,还会附带附加的额外信息,因为系统需要靠多出来的额外信息管理内存。特别是区块越小,额外负担所占的比例就越大,更加显得浪费。
组件三–算法
里面存放的是平时较为常用的算法,比如排序(sort)、查找(find)、reverse(逆置)、去重(unique)等许多优秀的方法。使我们处理数据起来更加的方便。
这里列举较为常用的。
其实STL里面常见的算法有许多,上面的导图中第二竖列为对应的头文件,第三数列为相应的算法,通常算法结合迭代器一起使用。
组件4–迭代器
什么是迭代器
迭代器为一种抽象的设计概念,是设计模式的一种。
在设计模式中iterator模式定义如下:提供一种方法,使之能够依序的巡防某个聚合物(容器)所含的元素,而又无需暴露该聚合物的内部表达式。
迭代器是一种类似指针的对象,而指针的各类行为中最常见也是最重要的便是内容提领和成员的访问,因此,迭代器的最重要的作用是对operator*和operator->进行重载的工作。迭代器是一种智能指针。
指针又可分为原生指针和对原生指针进行封装后的指针。
常见的迭代器
正向迭代器:
begin() --该容器的起始位置
end() --该容器的末尾位置(最后一个有效元素的下一位置),因为在在容器的相应操作中所选的区间为左闭右开的。
反向迭代器:
rbegin()–顾名思义,简述一下,string的反向迭代器 就是从end()的位置开始,对其元素打印就是打印对应rbegin()的前一个元素。
rend()–与 rbegin()使用,作为rbegin()的结束条件。
注意:正向迭代器搭配正向迭代器使用,反向迭代器的搭配反向迭代器使用,不可混用。
组件五—仿函数 另名:函数对象
什么是仿函数
仿函数的主要功能是为了搭配STL算法使用,单独使用仿函数的情况比较少。
仿函数(functors)在C++标准中采用的名称是函数对象(function objects)。仿函数主要用于STL中的算法中,虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求–函数指针无法和STL其他组件搭配,产生更灵活变化。仿函数本质就是类重载了一个operator(),创建一个行为类似函数的对象。
对于重载了()操作符的类,可以实现类似函数调用的过程,所以叫做仿函数,实际上仿函数对象仅仅占用1字节,因为内部没有数据成员,仅仅是一个重载的方法而已。实际上可以通过传递函数指针实现类似的功能,但是为了和STL内部配合使用,它提供了仿函数的特性。
仿函数的示例
class CIsLess
{public:// (): 函数调用运算符bool operator()(const Date* left, const Date* right){return *left < *right;}
};void TestPriorityQueue5()
{Date d1(2021, 7, 8);Date d2(2021, 7, 7);Date d3(2021, 7, 9);CIsLess c;c.operator()(&d1, &d2);c(&d1, &d2); // c对象:函数对象--->仿函数IsLess(&d1, &d2);priority_queue<Date*, vector<Date*>, CIsLess> p;p.push(&d1);p.push(&d2);p.push(&d3);
}
组件六 ---- 配接器(适配器)
什么是配接器
配接器(adapters)在STL组件的灵活组合运用功能上,扮演者轴承、转换器的角色。Adapter这个概念,事实上是一种设计模式。在设计模式中对adapter样式的定义如下:将一个class接口转化为另一个class接口,使原本接口不兼容而不能合作的classes,可以一起运作。
使用
1.应用于容器 container adapters , 比如stack和queue,其实就是一个适配器,他们通过修饰deque的接口而成就出的另一个容器风貌。
2.应用于迭代器iterator adapters
3,应用于仿函数
因为是初识阶段,所以并未做出太多详尽的解释,只是局限于简单介绍,在之后几天我会陆续的做出总结。有什么概况不到的或者有错误的希望大家指出。感谢大家指点。
STL 第一篇 初识STL相关推荐
- 【Linux入门指北】第一篇 初识Linux
目录 前言 一.Linux操作系统的发展历史 1.Linux操作系统的诞生 2.Linux操作系统的发展 1.自由软件基金会(FSF) 2.GPL协议 3.GUN工程 二.Linux的不同发行版本 1 ...
- 【C初阶】第一篇——初识C语言(万字篇,带你敲响C语言的大门)
接受平凡,努力出众,承认普通,但拒绝沉沦于平庸.大家好,我是你们的老朋友,小KK. 满满的 前言 什么C语言? 数据类型 变量和常量 定义变量的方法 变量的分类 变量的作用域和生命周期 ...
- HPM6750系列--第一篇 初识HPM6750
一.目的 HPM6750系列--第二篇 搭建Ubuntu开发环境_coder.mark的博客-CSDN博客https://blog.csdn.net/tianizimark/article/detai ...
- 微软实习生日记 第一篇 初识微软
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本人有幸 ...
- 第一篇 初识庐山真面目 ——Unity 3D Shader(2)
文章目录 第二章 Unity中的Shader(着色器)的形态 2.1 Unity通过ShaderLab来组织Shader 2.1.1 关键字 Shader 2.1.2 使用SubShader组织Sha ...
- spring el表达式解析_Spring之旅第一篇-初识Spring
目录 一.概述 二.模块 三.动手创建 一.概述 只要用框架开发java,一定躲不过spring,Spring是一个轻量级的Java开源框架,存在的目的是用于构建轻量级的J2EE应用.Spring的核 ...
- 第一篇 初识庐山真面目 ——Unity 3D Shader(4)
文章目录 第四章 基本的光照模型 4.1 光源对物体照明的分类 4.1.1 间接照明 4.1.2 直接照明 4.2 照明的计算方式:光照模型 4.2.1 漫反射和Lambert 4.2.2 镜面高光和 ...
- 第3章 感受(一)——3.12. Hello STL 向量篇
[回到目录] 白话C++ 3.12. Hello STL 向量篇 " 好消息!第XXX届国际美女大赛即将在中国举行,届时将有2999名来自世界各地的美女参赛.最新消息表明,本次大赛将对所有数 ...
- 第3章 感受(一)——3.14. Hello STL 算法篇
[回到目录] 白话C++ 3.14. Hello STL 算法篇 前一小节,在输出成绩时,我们从students中得到每个学生的学号,然后,通过for循环,在一个list中查找符合"学号等于 ...
最新文章
- 机器学习前沿:Michael Jordan与鬲融、金驰、马腾宇等青年才俊的对话
- MemCache在Windows环境下的搭建及启动
- simplePagination API
- ES6 - 字符串模板与新增字符串方法
- linux-内核启动流程分析
- 代理模式详解(静态代理和动态代理的区别以及联系)
- pcb布线拐角处打地孔_PCB线路板布线的10个重要规则——公众号【深圳LED网】
- 精度高、模型小、速度快!梯形DenseNets结构实现语义分割新高度!
- PyTorch Cookbook by Eric
- TeamViewer开机自启动实现在远程使用时重启远程计算机
- 黄杏元《地理信息系统概论》考研复习考点精讲(二)
- CleanMyPC比360管家好用N倍的电脑清理软件
- 一文彻底搞懂方差、协方差、协方差矩阵
- 通俗讲解光线追踪原理,一文理清各类光线追踪
- Assembler messages error gcc and clang build
- 网卡参数设置建议与各个网卡参数含义详解
- ios App加载网页,点击网页链接调用App处理
- 计算机c语言的作用,计算机c语言的特性有哪些
- 中职计算机专业英语ppt,中职计算机英语教学方法论文
- RabbitMQ的持久化