C++:顺序容器及顺序容器适配器(stack、queue、priority_queue)

来源:互联网 发布:大数据电商平台 编辑:程序博客网 时间:2024/05/21 17:53

顺序容器:vector、list、queue、deque。
为了定义一个容器类型的对象,必须先包含相关头文件,即

#include <vector>#include <list>#include <queue>#include <deque>

容器是类模板,要定义某种特殊的容器,必须在容器名后加一对尖括号,尖括号里面提供容器中存放的元素的类型:

vector<string> svec;list<int> ilist;queue<Sales_item> items;

1. 容器元素的初始化

1.1 将一个容器初始化为另一个容器的副本

C c(c2);//创建容器c2的副本c;

将一个容器复制给另一个容器时,类型必须匹配,容器类型和元素类型都必须相同。

1.2 初始化为一段元素的副本

通过使用迭代器将一种容器内的元素复制给另一种容器。

//用svec的每个元素给slist赋值list<string> slist(svec.begin(),svec.end());//用svec的部分元素给slist赋值vector<string>::iterator mid=svec.begin()+svec.size()/2;//找到svec的中间位置deque<string> front(svec.begin(),mid);deque<string> back(mid,svec.end());

使用迭代器,不要求容器类型相同,容器内的元素类型也可以不相同。

2. 迭代器和迭代器范围

常用迭代器运算包括:

*iter:  返回iter所指向的元素的引用iter->mem: 对iter进行解引用,获取指定元素中名为mem的成员。等效于(*iter).mem++iteriter++--iteriter--iter1==iter2iter1!=iter2//比较两个迭代器是否相等,当它们指向同一个容器中的同一个元素或超出末端的下一位置时,两个迭代器相等

对vector和queue而言,还有另外的迭代器操作:

iter + niter - niter1 += iter2iter1 -=iter2iter1-iter2

2.1 迭代器范围

迭代器范围是一个左闭合区间,其标准表示方式为:

[frist,last)

它表示范围从frist开始,到last结束,但不包括last。

 c.begin() :返回一个迭代器,指向容器c的第一个元素 c.end() :返回一个迭代器,指向容器c的最后一个元素的下一位置 c.rbegin():返回一个逆序迭代器,它指向c的最后一个元素 c.rend():返回一个逆序迭代器,它指向c的第一个元素的前面的位置

3. 容器适配器

STL提供了三种顺序容器适配器:queue、priority_queue和stack。使用适配器时,必须包含相关的头文件:

include <stack>include <queue>

3.1 适配器的初始化

适配器有两个构造函数:默认构造函数用于创建空对象,而带一个容器参数的构造函数将参数容器的副本作为其基础值。如:

stack<int> stk;queue<int> deq;stack<int> stk(deq);queue<int> que[10];//如果想建立元素是队列的数组,可以这样声明

默认的stack和queue都基于deque容器实现,而priority_queue则基于vector实现。

3.2 stack

stack提供的所有操作如下:

s.empty()   //如果栈为空,则返回true,否则返回false。s.size()    //返回栈中元素的个数s.pop()     //删除栈顶元素,但不返回其值s.top()     //返回栈顶元素的值,但不删除它s.push(item)//在栈顶压入新元素

3.3 queue

STL提供了两种风格的队列:FIFO队列(简称队列,queue)以及优先级队列。首先是queue,它的常用操作有:

q.empty()   //如果队列为空,则返回true,否则返回false。q.size()    //返回队列中元素的个数q.pop()     //删除队首元素,但不返回其值q.front()   //返回队首元素的值,但不删除它q.back()    //返回队尾元素的值,但不删除它q.push(item)//在队尾压入新元素

3.4 priority_queue

priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级。
STL默认使用<操作符来确定对象之间的优先级关系,所以如果要使用自定义对象,需要重载 < 操作符。

注意到,priority_queue的操作接口和stack是一样的:

q.empty()   //如果priority_queue为空,则返回true,否则返回false。q.size()    //返回priority_queue中元素的个数q.pop()     //删除priority_queue首元素,但不返回其值q.top()     //返回priority_queue首元素的值,但不删除它q.push(item)//在priority_queue尾压入新元素
0 0