STL: standard template library,标准模板库。由容器、迭代器、空间配置器、配接器、算法、仿函数六部分组成。STL并非是面向对象的,为了具有足够通用性,主要依赖于模板而不是OOP三要素(封装、继承以及多态),没有明显的类继承关系。有17个头文件:<algorithm>、<deque>、<functional>、<itreator>、<array>、<vector>、<list>、<forward_list>、<map>、<memory>、<numeric>、<queue>、<unordered_set>、<stack>、<utility>。
一、容器:
一定程度上充当着数据结构的作用,为适应不同数据的变化STL容器提供方便,通过对模板类的设置对常用的数据结构提供支持。其头文件有<vector>、<list>、<duque>、<set>、<map>、<stack><queue>。
序列式容器:向量(vector):连续存储的元素。
列表(list):由节点组成的双向链表,每个结点包含一个元素。
双端队列(deque):连续存储的指向不同元素的指针所组成的数组。
适配器容器:栈(stack):后进先出的值排列。
队列(queue):先进先出的值排列。
优先队列(priority_queue):元素的次序是有作用于所存储的值对上的某种谓词决定的一种队列。 关联式容器:集合(set):由节点组成的红黑树,每个节点都包含一个元素,节点间以某种作用于元素对的谓词排列,没有两个不同的元素能拥有相同的次序。
映射(map):由{键,值}对组成的集合,以某种作用于键对上的谓词排列。 多重映射(multimap):运行键对有相当的次序映射。
二、迭代器:
它提供了访问容器中对象的方法并定义了容器中对象的范围,如同一个指针的作用。迭代器由各种不同的传教方法,可以作为一个变量创建,可以为使用一个特定类型的数据而创建,作为指针,能够使用*操作符来获取数据,但STL不保证可以从一个迭代器来抵达另一个迭代器。软件设计的过程中,索引的问题都可以通过引进一个间接层来简化,在 STL中用迭代器来完成。将算法和容器连接为一个整体,几乎STL提供的所有算法均是通过迭代器来存取元素序列的,每个容器都定义了其本身所专有的迭代器。迭代器由头文件<utility>、<iterator>、<memory>组成。
<utility>:很小的头文件,包括了在STL中的几个模板的声明。
<iterator>:提供迭代器使用的许多方法。
<memory>:以不同寻常的方式为容器中的元素分配存储空间,为某些算法执行期间产生的临时对象提供机制,主要部分是模板类allocator,负责产生所有容器中的默认分配器。
迭代器的类型:Input iterators:提供对数据的只读访问。
Output iterators:提供对数据的只写访问。
Forward
iterators:提供读写操作,并能向前推进迭代器。
Bidirectional iterators:提供读写操作,并能向前和向后操作。
Random access iterators:提供读写操作,并能在数据中随机移动。
三、算法:
用来操作容器中的数据的模板函数。C++通过模板机制允许推迟对某些类型的选择,直到需要使用模板或者对模板进行转换的时候。STL提供相当多的算法,不依赖于任何特定的数据类型,在一个有效的框架中完成这些算法。由<algorithm>、<numeric>、<functional>组成。
<algorithm>:最大的一个头文件,由一大堆模板函数组成,每个函数在很大程度上是独立的,常用的功能有比较、交换、查找、遍历操作、复制、修改、删除、反转、排序、合并等。
<numeric>:包括几个在序列上进行简单数学运算的模板函数,如:加减乘除等。
<functional>:定义了一些模板类,用来声明函数对象。