“不会STL,就别说你学会了C++!”
------沃布至 · 道誰硕德
STL
1什么是STL
STL全称(standard template libaray),:是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
2. STL的主要组成部分(六大组件)
①:容器
容器就是用来存放数据的类模板。(可变长数组、链表、平衡二叉树等数据结构在 STL 中都被实现为容器。)
容器中可以存放基本类型的变量,也可以存放对象。对象或基本类型的变量被插入容器中时,实际插入的是对象或变量的一个复制品。
②:迭代器
迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。
简单来说,迭代器就是用来遍历容器的。
对于迭代器,我们还有一个在我们以后的学习中经常会遇得到的问题“ 迭代器失效”,这个问题我就不放在这篇博客中了,我会在后面关于vector的博客中详细谈谈这个问题。
③:算法
使用C++标准库的算法,需包含头文件< algorithm >。
STL算法用于处理一个或多个iterator区间,第一个区间通常以起点和终点表示,其他区间则多数情况下只需提供起点足矣,其终点可以根据第一区间的元素数量推导出来。调用者需保证区间的有效性。STL算法命名时,引入了两种特殊的后缀:
STL中的算法总共分为下列几大类:
-
非更易型算法(nomodifying algorithm)
-
更易型算法(modifying algorithm)
-
移除型算法(removing algorithm)
-
变序型算法(mutating algorithm)
-
排序算法(sorting algorithm)
-
已排序区间算法(sorted-range algorithm)
-
数值算法(numeric algorithm)
④:适配器
配适器又叫容量配适器,容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。
⑤:仿函数
仿函数的主要功能是为了搭配STL算法使用,单独使用仿函数的情况比较少。
仿函数(functors)在C++标准中采用的名称是函数对象(function objects)。仿函数主要用于STL中的算法中,虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求–函数指针无法和STL其他组件搭配,产生更灵活变化。仿函数本质就是类重载了一个operator(),创建一个行为类似函数的对象。
⑥:空间配置器:
空间配置器的存才就是为了提高内存的使用效和使用效率。
为了提高这两个效率,空间配置器分为了第一级配置器与第二级配置器。
- 一级空间配置器
一级空间配置器只是简单的封装了一下malloc和free实现的。在allocate函数中如果通过malloc申请内存失败(失败返回0)就改用oom_malloc(size_t n)函数尝试分配内存,如果oom发现没有指定new-handler函数的话,那就直接调用__THROW_BAD_ALLOC,丢出bad_alloc或是直接通过exit(1)中止程序。
- 二级空间配置器
二级空间配置器为了避免小块内存带来的碎片化问题,使用内存池+free_list的形式管理内存。第二级空间配置器的代码如下所示。若申请的内存大于128个字节则直接调用一级空间配置器,如果不大于就将任何小额区块的内存__n上调至8的倍数(即使你请求1个字节,那也会申请8个字节)。这是因为在二级空间配置器中内存是通过free_list管理的。