1. STL简介
STL(Standard Template Library),即标准模板库,是一个革命性的、高效的C++程序库,是最新的C++标准程序库的一个子集。它包括六大组件,其中3个主要组件:算法(algorithm)、容器(container)、迭代器(iterator)和3个辅助组件:配置器(allocators)、适配器(adapters)、函数对象(function object)。STL中,几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机制。
2. STL的主要头文件
头文件名 | 内容 |
<algorithm> | 和<numeric>定义了STL通用算法 |
<numeric> | 和<algorithm>定义了STL通用算法 |
<deque> | deque定义 |
<functional> | 通用函数对象的定义 |
<iterator> | 所有在容器类型中定义的迭代器的祖先定义 |
<vector> | vector定义 |
<list> | list定义 |
<map> | map、multimap定义 |
<memory> | 主要是智能指针auto_ptr的定义和一些全局临时内存处理函数的定义;头文件包含了另一个重要头文件<xmemory>,主要是空间配置器allocator的定义 |
<queue> | queue、priority_queue定义 |
<set> | set、multiset定义 |
<stack> | stack定义 |
<utility> | 定义了pair,定义了基本的iterator概念 |
3. STL中的容器
向量(vector):
一块连续的线性存储空间。它是顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来说,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可以再改变了;而vector是动态分配空间,随着元素地不断插入,它会按照自身的一套机制不断扩充自身的容量。每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新的内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这个时候,如果原先有一个迭代器指向的是旧的内存,而旧的内存已经销毁了,则此时迭代器已经失效了。所以当操作容器时,迭代器要及时使用,而不要在对容器进行插入等操作后继续使用过时的迭代器。
列表(list):
双向循环链表。不支持对元素的任意存取(即不通过下标[]存取)。List中提供成员函数和vector类似,有begin、end、rbegin、rend、push_back、pop_back,同时list提供对表首元素的操作push_front、pop_front,这是vector不具备的。和vector另一点不同的是,list的迭代器不会存在失效的情况,它不像vector会保留备份空间,在超过容量额度时重新全部分配内存,导致迭代器失效;list没有备份空间的概念,插入一个元素就申请一个元素的空间,所以它的迭代器不会失效。
双队列(deque):
双向开口的连续线性存储空间。从容器的两端都能进行元素的插入和删除操作。Deque虽然说是连续线性存储空间,但这种连续性只是表面上的,或者说是一种假象。实际上的情况是,它的内存存储区是动态分配的,它在堆上分配了一块一块的动态存储区,每一块动态存储区本身是连续的,deque自身的机制把这一块一块的存储区虚拟地连在一起,给人一种假象,好像整个deque的存储是一个整的连续性的空间。正是因为这样,所以deque没有vector那种所谓容量的概念。它首次插入一个元素,默认会动态分配512字节空间,当这512字节空间用完后,它会再动态分配另外512字节空间,然后把这两个动态空间虚拟地连在一起,让使用者以为这是连续的1024字节空间一样。Deque的这种设计,使得它具有比vector复杂得多的架构、复杂得多的算法和复杂得多的迭代器设计等,而这种复杂度和简单的vector是不在一个数量级别上的。这就使得deque的效率比vector低得多。所以非不得已,尽量用vector和list,而不要用deque。Deque除了双向进出,让编程者有更多选择性、更多灵活性,以及编程时使用非常方便之外,其实没有带来多少好处。和效率的巨大损失相比,它的优点有些得不偿失。
栈(stack):
先进后出的数据结构。Stack是建立在deque数据结构基础上的。它是一种先进后出(First In Last Out, FILO)的数据结构。除了在stack的最顶端压栈来操作元素外,没有任何办法来存取stack中的元素。Stack不允许对容器的遍历操作。
队列(queue):
先进先出的数据结构。Queue是建立在deque数据结构基础上的,这里的queue对应在数据结构和算法中提到的队列的概念,它是一种先进先出(First In First Out,FIFO)的数据结构。除了在queue的最顶端和最底端操作元素外,没有任何办法来存取queue中的元素。Queue不允许对容器的遍历操作。
优先队列(priority_queue):
按权值决定出列顺序的数据结构。Priority_queue(优先队列)是建立在vector数据结构基础上的,priority_queue是有优先权值queue,它只允许在容器的两端操作元素,但它并非像queue那样先进先出,它设定了一个优先权,优先权大的先出。除了在priority_queue的最顶端和最底端操作元素外,没有任何办法来存取priority_queue中的元素。Priority_queue不允许对容器的遍历操作。
集合(set):
所有元素都会根据键值自动被排序,键就是值,值就是键。Set(集合)是一种包含已排序对象的关联容器。Set的特点是,所有元素都会根据键值自动被排序。知道关联容器是有键和值的,而set的键就是值,值就是键。
多重集合(multiset):
支持重复键值的set。
映射(map):
由{键,值}对组成的集合。Map是一种包含已排序对象的关联容器。Map的特点是,所有元素都会根据键值自动被排序。知道关联容器是有键和值的,和set不同,map的键是键,值是值。需要注意,关联容器的键是不允许被改变的,所以map的键是不能被修改的,但它的值是可以修改的。Map不允许两个元素具有相同的键。Map采用的是非线性链表结构----树,所以它的迭代器不会像vector容器的迭代器那样因为重新分配存储区而失效。Map的键和值以pair形式存在。
多重映射(multimap):
支持重复键值的map。
该内容摘自<<C++编程关键路径>>,如转载请注明出处。