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

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

#include 
#include 
#include 
#include 

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

vector svec;
list ilist;
queue items;

1. 容器元素的初始化

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

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

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

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

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

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

3.1 适配器的初始化

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

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

//升序队列
priority_queue ,greater > q;
//降序队列
priority_queue ,less >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尾压入新元素

你可能感兴趣的:(学习C++)