STL 第一篇 初识STL

Posted 蚍蜉撼树谈何易

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL 第一篇 初识STL相关的知识,希望对你有一定的参考价值。

什么是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的主要内容,如果未能解决你的问题,请参考以下文章

C++ 提高教程 STL -容器算法迭代器初识

(C++基础_STL) —— 初识STL

(C++基础_STL) —— 初识STL

(C++基础_STL) —— 初识STL

C++提高编程STL 初识

C++STL第一篇:string类介绍及模拟实现