http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html
一、STL简介
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、
<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。
二、算法
大家都能取得的一个共识是函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比
使用整型作为它的参数类性要高。而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用
算法。它是在一个有效的框架中完成这些算法的——你可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。这样一来
,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算法模板,就可以完成所需要的功能并大大地提升效率。
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。
<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
<functional>中则定义了一些模板类,用以声明函数对象。
容器部分主要由头文件<vector>,<list>,<deque>,<set>,<map>,<stack>和<queue>组成
1、<vector> 向量 动态数组实现 ,在内存中有一个指针指向一块连续的内存,类似数组结构。
特点:支持随机访问数据,因为其在内存中的单元是连续的,而且vector可以自动增长,当向一个vector中继续存放数据的时候,如果当前内存大小不够,内核会重新生成一个是原来两倍大小的单元,适用于对象简单,变化较小,并且频繁随机访问的场景。
2、列表(list) 由节点组成的双向链表,每个结点包含着一个元素<list>
双向链表,每个元素的内存单元结构不是连续的,每一个节点都有三个域,前驱结点,指针域,数据域,后驱节点,指针域,
缺点:因为单元内存不连续所以不支持随机访问,适用于:对象变化大,并且对象数量变化频繁删除和插入操作的情况。
3、双队列(deque) 连续存储的指向不同元素的指针所组成的数组<deque>
集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 <set>
4、多重集合(multiset) 允许存在两个次序相等的元素的集合 <set>
5、栈(stack) 后进先出的值的排列 <stack>
6、队列(queue) 先进先出的执的排列 <queue>
7、优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 <queue>
8、映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列 <map>
9、多重映射(multimap) 允许键对有相等的次序的映射 <map>