《STL源码剖析》 笔记

第01章 概论与版本简介

  • 为建立数据结构和算法的一套标准,并且降低其间的耦合关系,以提升各自的独立性、弹性、交互操作性,C++社群里诞生了STL。
  • STL是一个抽象概念库,这些抽象概念包括:
    ①最基础的:可被赋值、不需要任何参数就可构造、可判断是否相同、可比较大小、正规。
    ②高阶一点的:具输入功能的迭代器、具输出功能的迭代器、单向迭代器、双向迭代器、随机存取迭代器、一元函数、二元函数、传回真假值的一元判别式、传回真假值的二元判别式。
    ③更高阶的:序列式容器、关联式容器。
  • STL的六大组件

    ①容器(containers):各种数据结构,如vector、list、deque、map等。实现上看是一种class template。

    ②算法(algorithms):各种常用算法,如sort、search、copy等。实现上看是一种function template。

    ③迭代器(iterators):容器与算法之间的胶合剂,一种“泛型指针”。将*、->、++、--等指针相关操作重载的class template。所有STL容器都附带有自己专属的迭代器。

    ④仿函数(functors):行为类似于函数,可以作为算法的某种策略。

    ⑤配接器(adapters):一种用来修饰容器或仿函数或迭代器接口的东西。像queue、stack,看起来像容器,其实只是一种容器配接器。

    ⑥配置器(allocators):负责空间配置与管理。一个实现了动态空间配置、空间管理、空间释放的class template。
  • 由于STL已成为C++标准程序库的大脉系,所以目前所以的C++编译器一定有一份STL。
  • STL并非以编译好的二进制代码出现,而是以源代码提供给用户。
  • 因为C++标准规定,所以标准头文件不再有扩展名。但某些STL版本同时具有扩展名和无扩展名两份文件(可能是为了向下兼容、或者内部组织管理)。
  • 任何一个STL算法,都需要获得由一对迭代器标示的区间,来表示操作的范围。而这个区间是[first,last)表示。也就是说实际范围是从first开始,到last-1结束。
  • 在C时代,要将函数当参数传递,只能通过函数指针。但函数指针有缺点,它无法拥有自己的“状态”,也就是说没法再次将一些修饰条件加于其上、改变其状态。
  • 为此,STL算法接受所谓的“策略”或“一组操作”,以仿函数的形式呈现。
  • 仿函数:使用起来和函数一样,如果针对某个class进行operator()重载【即重载()符号】,它就成为一个仿函数。
#include<iostream>
using namespace std;

//将operator()重载,使plus成为一个仿函数
template<class T>
struct plus{
	T operator()(const T& x, const T& y)const { return x + y; }
};

int main() {
	//产生一个仿函数对象
	plus<int> test;
	//使用仿函数,就和使用普通函数一样
	cout << test(3, 5) << endl;

	//也可以产生一个临时对象,并且调用
	cout << plus<int>()(3, 5) << endl;

	getchar();
	return 0;
}

第02章 空间配置器(allocator)

  • 叫做空间配置器,而不是内存配置器。因为除了内存,空间还是可以是磁盘或者其他存储介质。
  • 为精密分工,STL allocator将对象构造析构内存分配释放两个阶段操作区分开(new delete时是合并的)。
  • 内存配置操作:alloc::allocate()
    内存释放操作:alloc::deallocate()
    对象构造操作:::construct()
    对象析构操作:::destroy()

猜你喜欢

转载自blog.csdn.net/weixin_39731083/article/details/82084450