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

顺序容器: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
++iter
iter++
--iter
iter--
iter1==iter2
iter1!=iter2//比较两个迭代器是否相等,当它们指向同一个容器中的同一个元素或超出末端的下一位置时,两个迭代器相等

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

iter + n
iter - n
iter1 += iter2
iter1 -=iter2
iter1-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特别之处在于,允许用户为队列中存储的元素设置优先级。
定义:priority_queue<Type, Container, Functional>

Type 就是数据类型,
Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),
Functional 就是比较的方式,
当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆。

//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;

//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

自定义类型需要重载仿函数:

struct cmp{
	bool operator() ( Node a, Node b ){//默认是less函数
	//返回true时,a的优先级低于b的优先级(a排在b的后面)
		if( a.x== b.x ) return a.y> b.y;      
		return a.x> b.x; }
	};

	priority_queue<Node, vector<Node>, cmp> q;

注意到,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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值