STL是提供了一组表示容器、迭代器、函数对象和算法的模板。容器类似数组,可以存储若干个值。迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;函数对象时类似于函数的对象,可以是类对象或函数指针,算法是完成特定任务的处方。
Vector对应容器,创建vector的方法如下:
#include vector
using namespacestd;
vector<int>ratings(5);
vector<double>scores(10);
可以用操作符[]类似数组的方法来访问各个元素。
每个容器类都定义一个合适的迭代器,该迭代器的类型是一个名为iterator的typedef,其作用域为整个类。例如,要为vector的double类型规范声明一个迭代器
vector<double>::iteratorpd;
假设scores是一个vector<double>对象
Vector<double>scores;
则可以使用迭代器pd执行这样的操作:
pd =scores.begin();
*pd =22.3; // 改变数组的大小
++pd;
可以使用下面的代码来显示容器的内容:
for(pd =scores.begin(); pd != scores.end(); pd++)
cout<< *pd <<endl;
push_back()是一个方便的方法,它将元素添加到矢量末尾,并管理内存,增加矢量长度,使之能够容纳新的成员。
vector<double>scores;
double temp;
scores.push_back(temp);
erase()方法删除矢量中给定区间的元素,它接受两个迭代器参数,这些参数定义了要删除的区间。可以使用如下代码:
scores.erase (scores.begin(), scores.begin()+2);
insert()结构3个迭代器参数,第一个参数指定了新元素的插入位置,第二个和第三个迭代器参数定义了被插入区间,该区间通常是另一个容器对象的一部分。
下面来看3个具有代表性的STL函数:for_each(), random_shuffle()和sort()。For_each()的三个参数,前两个是定义容器中区间的迭代器,最后一个是指函数的指针。使用方法如下:
for_each (books.begin(), books.end(), ShowReview);
Random_shuffle()函数接受两个指定区间的迭代器参数,并随机排列该区间中的元素。
Random_shuffle(books.begin(),books.end());
sort() 函数要求容器支持随机访问,该函数有两个版本,第一个版本接受两个定义区间的迭代器参数,并使用为存储在容器中的类型元素定义的<操作符,对区间中的元素进行操作,例如:
vector<int>coolstuff;
sort(coolstuff.begin(),coolstufff.end());
如果容器元素是用户定义的对象,那么必须定义能够处理该类型对象的operator<()函数。
另外一个版本的sort()接受3个参数,前两个参数也是指定区间的迭代器,最后一个参数是指向要使用的函数的指针,而不是用于比较的operator<(),使用方法如下:
sort(books.begin(),books.end(), WorseThan);
下面详细看6种序列容器类型
(1) Vector
Vector是数组的一种类表示,它提供了自动内存管理功能,可以动态地改变vector对象的长度,并随着元素的添加和删除而增大和缩小。它提供了对元素的随机访问,在尾部添加和删除元素的时间时固定的,但在头部或中间插入和删除元素的负责度为线性时间。
(2) Deque
Deque 模板类表示双端队列(double-endedqueue), 通常被简称deque。在STL中,其实现类似于vector容器,支持随机访问,主要区别在于,从deque对象的开始位置插入和删除元素的时间时固定的,而不像vector中那样是线性的。
(3) List
List模板类表示双向链表,除了第一个和最后一个元素外,每个元素都与前后的元素相链接,这意味着可以双向遍历链表,list和vector之间关键的区别在于,list在链表中任一位置进行插入和删除的时间都是固定的。Vector强调的是通过随机访问进行快速访问,而list强调的是元素的快速插入和删除。
(4) Queue
Queue 模板类是一个适配器类,为了能够让输出流使用迭代器接口,queue模板让底层类展示典型的队列接口。Queue不仅不允许随机访问队列元素,甚至不允许遍历队列,它把使用限制在定义队列的基本操作上,可以将元素添加到队尾,从队首删除元素,查看队首和队尾的值,检查元素数目和测试队列是否为空。
(5) Priority_queue
Priority_queue模板类是另一个适配类,它支持的操作与queue相同,两者之间的主要区别在于,在priority_queue中,最大的元素被移到队首,内部区别在于,默认的底层类是vector。可以修改用于确定哪个元素放到队首的比较方式,方法是提供一个可选的构造函数参数。
(6) Stack
与queue相似,stack也是一个适配器类,它给底层类(默认为vector)提供了典型的堆栈接口。Stack模板的限制比vector更多,它不仅不允许随机访问堆栈元素,甚至不允许遍历堆栈。它把使用限制在定义堆栈的基本操作上,即可以将压入推到栈顶,从栈顶弹出元素,查看栈顶的值,检查元素数目和测试堆栈是否为空。