STL温习

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更多,它不仅不允许随机访问堆栈元素,甚至不允许遍历堆栈。它把使用限制在定义堆栈的基本操作上,即可以将压入推到栈顶,从栈顶弹出元素,查看栈顶的值,检查元素数目和测试堆栈是否为空。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值