STL六大组件
标准模板库(Standard Template LIbrary),是C++的一个软件库。STL提供了六大组件:
- 容器:各种数据结构,例如vector,list,deque,set,map等,是类模板
- 算法:各种常用算法,例如sort,search,copy,erase等,是函数模板
- 迭代器:容器算法耦合剂,泛型指针,类模板
- 仿函数:算法某种策略
- 适配器:修饰容器、迭代器或仿函数,例如queue,stack
- 配置器:空间配置、管理、释放,是类模板;STL每个容器都指定了缺省空间配置器alloc。
容器详解
定义:置物之所。主要运用数据结构实现,这些数据结构包含数组、链表、树、栈、队列、集合、映射表等。
分类:序列容器和关联容器。序列式容器强调值的排序,序列式容器中的每个元素均有固定的位置。 关联式容器为二叉树结构,各元素之间没有严格的物理上的顺序关系。
vector:可变长动态单端数组。可以随时增删元素,内存空间连续,随机访问速度快。
deque:双端队列,首尾均可高效插入和删除,随机访问速度快,元素在内存中非连续存储
list:双向循环链表,内存空间不连续,不支持随机访问,对于任意位置的插入和删除都很快速,操作后指针、迭代器、引用都不会失效。
forward_list:单链表,只支持单向访问,在链表任何位置进行插入删除操作都很快速
array:C++11新增的容器,比vector效率高,大小固定,无法动态扩展或收缩,只允许访问和替换存储的元素,使用要在std命名空间内
算法详解
定义:问题之解。利用有限的步骤解决数学问题。
分类:质变算法、非质变算法、排序算法、数值算法。
<algorithm>:所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
<numeric>:体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
<functional>:定义了一些模板类,用以声明函数对象。
迭代器详解
定义:容器算法耦合剂。提供可以依序寻访某个容器的各个元素的方法,无需暴漏容器内部表示。迭代器种类如下图所示:
分类:
基本操作:*it:引用迭代器it,返回指向迭代器当前元素的引用;it++或++it:将迭代器it后移一位;it--或--it:将迭代器it前移一位;vector <int> :: iterator it 即声明了一个vector的迭代器it
仿函数详解
定义:是类似函数的对象,可以像函数一样被调用,接受参数并返回结果;也是一种类对象,重载函数调用运算符 operator(),通过重载该运算符,可以使得对象可以像函数一样被调用,并对传入的参数进行处理和操作;具有内部状态,可在多次调用之间保持状态信息,可在算法中存储额外信息,不仅仅是参数。
分类:
内建仿函数,算术类:加plus、减minus、乘multiplies、除divides、取模modulus,关系类:等于equal_to、不等于not_equal_to、大于等于greater_equal、小于less_equal,逻辑类:与logical_and、或logical_or、非logical_no,一元仿函数(Unary Functor):接受一个参数,并对其进行操作,二元仿函数(Binary Functor):接受两个参数,并对它们进行操作;
函数指针仿函数:一种将函数指针封装为函数对象的方式,以便可以像函数一样调用。它是由用户自定义的仿函数类,不属于STL提供的预定义函数对象。其中重载了函数调用运算符 operator() 来实现函数指针的调用。用户可以根据自己的需求定义一个函数指针仿函数,将特定的函数指针封装为函数对象,从而能够在算法中使用;
适配器仿函数:bind绑定函数对象的参数,function封装任意可调用对象(函数对象、函数指针、成员函数指针等),mem_fn将成员函数指针转换为函数对象,not1和not2对一元和二元谓词取反,logical_not对一元谓词取逻辑非,unary_negate和binary_negate对一元和二元谓词进行取反;
适配器详解
定义:设计模式,将一个类的接口转换为另一个类的接口,使得这两个类能够协同工作。
分类:
stack:一个先进后出即LIFO的容器,将一个底层容器封装成栈的接口,提供push()、pop()、top()等操作,内部默认使用deque作为其底层实现容器,不支持随机访问、只允许在栈顶添加/删除元素;
queue:一个先进先出即 FIFO 的容器,将一个底层容器封装成队列的接口,提供了push()、pop()、front()、back()等操作,内部默认使用deque作为其底层实现容器,只有队头和队尾可以被访问,不能有遍历行为
priority_queue:在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的,即默认从大到小的排序,底层通过堆来实现。
空间配置器
定义:用于动态分配和管理内存的组件,在底层提供了对内存的分配和释放操作,被用于支持各种容器和算法的内存管理需求
分类:allocator:一个泛型的空间配置器类,用于分配和释放单个对象的内存。它通过allocate()函数分配内存,并通过deallocate()函数释放内存,使用new和delete运算符来完成内存的分配和释放;allocator_traits:一个辅助类模板,用于访问空间配置器的属性和行为,提供了一些模板特化和类型别名,以便在使用空间配置器时进行适当的配置<