一、STL概述。
1、基本概念
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件统称。
STL从广义上讲分为三类:algorithm(算法)、container(容器)和 iterator(迭代器)。容器和算法可以通过迭代器无缝地连接。几乎所有代码都采用了模板类和模板函数的方式。相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面13个头文件中:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>、<utility>。
老师这张图太形象了,必须放上来,感觉当初没学到精髓。容器就是存数据的地方,不同的数据根据其特点选用不同的容器,算法就是处理数据的地方。为了使得算法和存数据的地方足够通用,所以使用上了模板。为了使得算法能够对数据的处理,于是有了迭代器。
(1)STL六大组件
容器(Container)、算法(Algorithm)、迭代器(Iterator)、仿函数(Function object)、适配器(Adaptor)、空间配置器(allocator)。
(2)STL的优点
STL是C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但是这种分离使得STL变得非常通用。例如:STL的容器中,可以放入元素、基础数据类型变量、元素的地址等。STL中的sort()函数可以用来操作vector、list等容器。
程序员可以不用思考STL的具体实现过程,只要能够熟练掌握使用STL就可以。
STL具有高可重用性,高性能,高移植性,跨平台的优点。高重用性:STL几乎所有的代码都采用了模板类和模板函数的方式实现;高性能:如map可以高效地从十几万条记录里面查找出指定的记录,因为map指定的时采用红黑树的变体实现的。(红黑树是平衡二叉树的一种)
2、容器container
在实际的开发过程中,当程序存在着对时间要求很高的部分时,数据结构的选择就显得很重要。STL容器为我们提供特定类型下的数据结构,通过设置一些模板,STL容器对常用的数据结构提供了支持,这些模板的参数允许我们制定容器中元素的数据类型。容器部分主要头文件<vector>、<list>、<deque>、<set>、<map>、<stack>和<queue>组成。
(1)容器的概念
用来管理一组数据。

(2)容器的分类
序列式容器(Sequence containers)
每个容器有一个固定位置——取决于插入时机和地点,和元素值无关。如vector、deque、list。
关联式容器(Associated containers)
元素位置取决于特定的排序准则,和插入顺序无关。如set、multiset、map、multimap。
3、迭代器iterator
迭代器在STL中用来将算法和容器联系起来,起着一种黏合剂的作用,几乎所有的STL提供的所有算法都是通过迭代器存取元素序列进行工作的。每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。迭代器部分主要由头文件<utility>、<iterator>和<memory>组成。
4、算法alogrithm
C++利用模板的机制允许推迟某些类型的选择,STL利用这一点提供了相当多的有用算法,在一个有效的框架中完成这些算法——将所有的数据类型划分为少数的几类,就可以在模板参数中使用一种类型代替同一种类的其他类型。STL实现了大约100个实现算法的模板函数。算法部分主要由头文件<algorithm> <numeric>和<functional>组成。
5、C++标准库
太多太多了,我可以抽空再好好理吗。。。。。
二、容器
1、string
(1)string的概念
string是STL的字符串类型,通常用来表示字符串。string和char *的比较:string是一个类,char *是一个指向字符的指针;string中封装了char *,管理这个字符串,是一个char *型的容器;string不用考虑内存释放和越界问题,string管理char *所分配的内存,每一个string复制,取值都由string类维护;string提供了一系列的字符串操作函数:查找find、拷贝copy、删除erase、替换replace、插入insert。
(2)string的构造函数
string(); //默认构造函数,构造一个空的字符串string s1
string(const string &str); //拷贝构造函数,构造一个和str一样的string
string(const char *s); //带参构造函数,用字符串s初始化
string(int n, char c); //带参构造函数,用n个字符c初始化
(3)string类的存取操作
connst char &operator [](int n) const; // [ ]在刚好越界的时会返回char(0) zai
const char & at(int n) const; //at()在越界时抛出异常
(4)从string取得const char *的操作
const char * c_str() const; //返回一个以'\0'结尾的字符串的首地址
(5)从stirng拷贝到指向char *指向的内存空间的操作
int copy(char *s, int n, int pos = 0) const; //把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷