STL之容器适配器:stack,queue , priority_queue

原创 2012年03月26日 20:43:52

C++STL之stack与queue:

STL提供了三种容器适配器:stack queue , priority_queue。这些容器成为容器适配器,由顺序容器变化而来。不支持迭代器操作。在使用栈,队列的时候可以调用STL中的模板,可以在一程度上简化代码,但是可能会引来效率的降低。

stack

头文件:#include<stack>

1.创建一个栈对象:

stack<TC> s ; //创建一个数据类型为T类型的栈s,该栈基于C实现,T可以是基本的数据类型也可以是自定义的数据类型,而C可以是vectordeque或者list,默认情况下deque实现

如:stack<int> s ;//创建一个int型的栈,默认使用deque实现。

stack<int , vector<int>> s ;//创建一个int型的栈,由vector实现。

2.push(T t) ;//向栈中添加一个元素。

3.pop() ;//删除栈顶元素

4.top();//返回栈顶元素

5.size();//返回栈的大小

6.empty() ;//若栈为空,则返回真

queue:

头文件:#include<queue>

stack一样可以由deque或者list来构造一个queue对象,默认情况下由deque实现。

1.创建一个queue对象

queue<T  , C>  Q ; //创建一个T类型的由C实现的队列Q

类型T可以是基本数据类型,也可以是自定义的数据类型。C可以是list也可以是deque。例如:queue<int> q1 ;//创建一个int型的队列q1,基于deque实现。queue<int ,list<int>> q2 ;//创建一个基于list实现的队列。

2.push(T t) ;//将数据t插入到队尾

3.pop();//删除队首元素

4.front();//返回队首元素,但不删除

5.back() ;//返回队尾元素,但不删除

6.size() ;//返回队列的大小

7.empty() ;//若队列为空返回真

priority_queue

头文件:#include<queue>

优先队列中,每个元素都被赋予一个优先级,优先级最高的元素首先被访问/删除。优先权高的先出列。priority_queue内部是调用make_heap () , pop_heap() ,push_heap()实现,属于堆的另一中形式。

1.创建一个对象:

priority_queue<Type, Container, Functional>

其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。

Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.

STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,也可以通过重载operator<或者重定义less或者greater()函数

优先队列就是大顶堆,队头元素最大。

2.相关的函数调用与queue相同,再次不再赘述。

3.关于自定义优先级:

A. 基本数据类型实现最大堆,默认,此时不需要传递带三个参数。

B. 基本数据类型实现最小堆,将greater()作第三个参数传递过去,此时还需要将第二个参数传过去,否则可能导致编译错误(我在自己的机子上测试的时候没有传递第二个参数,出现编译错误),此外在第三个参数与最后的>中间需要添加一个空格,否则会当作输出流而出现编译错误,例如:

priority_queue<int, vector<int>, greater<int> > q;

如下程序:

#include<iostream>
#include<queue>
using namespace std ;
int  main()
{
//priority_queue<int> q1 ;
 priority_queue<int, vector<int>, greater<int> > q2 ;
int i ;
for(i = 0 ; i < 10 ; i ++)
{
q2.push(i) ;
}
while(!q2.empty())
{
cout<<q2.top()<<endl;
q2.pop() ;
}
return 0 ;
}


C. 自定义数据类型,则必须重写operator<或者实现相应的仿函数

(1) . 重载operator<,此时不需要传递第三个参数,可以传递前两个参数,第二个参数可传可不传,注意此时一定不能传递第三个参数,例如:

#include<iostream>
#include<queue>
using namespace std ;
struct Node
{
int a ;
int index ;
} ;
bool operator<(Node a , Node b)
{
return a.a < b.a ;//此时得到的将会是最大堆,优先权是Node中的//a作为衡量
}
int  main()
{
priority_queue<Node> q ;
int i ;
for(i = 0 ; i < 10 ; i ++)
{
Node a ;
cin>>a.a ;
a.index = i ;
q.push(a) ;
}
while(!q.empty())
{
cout<<"a:"<<q.top().a <<"\tindex :"<<q.top().index<<endl ;
q.pop() ;
}
return 0 ;
}


(2) 实现相应的仿函数:

例如:

#include<iostream>
#include<queue>
using namespace std ;
struct Node
{
int a ;
int index ;
} ;
/*
bool operator<(Node a , Node b)
{
return a.a > b.a ;
}
*/
struct cmp//这里实现自定义的优先权
{
bool operator() (Node &a , Node &b)
{
return a.a > b.a ;
}
};
int  main()
{
priority_queue<Node , vector<Node> , cmp > q ;
int i ;
for(i = 0 ; i < 10 ; i ++)
{
Node a ;
cin>>a.a ;
a.index = i ;
q.push(a) ;
}
while(!q.empty())
{
cout<<"a:"<<q.top().a <<"\tindex :"<<q.top().index<<endl ;
q.pop() ;
}
return 0 ;
}


以上三种容器适配器都没有清除函数,不能一次将对应的存储元素通过函数一次全部删除完,只能通过判断是否为空,然后不断的将元素弹出,这使得相应的效率很低。因此在选择的时候需要慎重。

stl之适配器容器——stack, queue, priority_queue

stack          stl实现stack的方法:以某种既有容器作为底部结构,将其接口改变,使之符合“先进后出”的特性,形成一个stack。这种“修改某物接口,形成另一种风貌”的方式,成为a...
  • CODINGCS
  • CODINGCS
  • 2016年03月13日 20:23
  • 326

STL 笔记(三) 容器适配器 stack、queue、priority_queue

栈 stack 是一种先进后出的(First In Last Out, FILO)的数据结构。在 STL中,其底层容器默认使用的是 deque, 也可以自己指定用 vector 或 list容器,然后...
  • thisinnocence
  • thisinnocence
  • 2014年09月29日 17:42
  • 2251

STL学习笔记— —特殊容器priority_queue

简介在头文件 中定义namespace std { template class priority_q
  • lyh03601
  • lyh03601
  • 2016年05月04日 17:41
  • 4878

带你深入理解STL之Stack和Queue

上一篇博客,带你深入理解STL之Deque容器中详细介绍了deque容器的源码实现方式。结合前面介绍的两个容器vector和list,在使用的过程中,我们确实要知道在什么情况下需要选择恰当的容器来满足...
  • terence1212
  • terence1212
  • 2016年08月26日 21:51
  • 1896

容器适配器(stack,queue,priority_queue)

1.基本概况 A.Stack,queue,priority_queue分别对应堆,队列和优先队列 B.STL中各种排序,查找,变序等算法均不适用 2.成员函数 栈支持的操作有: 1.empt...
  • qq_35452997
  • qq_35452997
  • 2017年12月02日 21:04
  • 20

容器适配器:stack、queue、priority_queue

#include #include #include #include #include #include #include #include using namespace std; int ...
  • woshizfs
  • woshizfs
  • 2013年09月21日 12:15
  • 563

【c++】STL里的priority_queue用法总结

1、头文件 #include 2、定义 priority_queue p; 3、优先输出大数据 priority_queue Type为数据类型, Container为保存...
  • xiaoquantouer
  • xiaoquantouer
  • 2016年07月24日 20:39
  • 9785

STL学习--queue priority_queue

简介 queue是一种先入先出(FIFO)的数据结构,它有两个出口,允许从底端加入元素,从顶端移除元素。 STL底层默认基于deque容器实现,可在创建是更改list: queue > str_que...
  • myloveqingmu
  • myloveqingmu
  • 2016年10月21日 10:35
  • 649

C++ STL入门教程(4)——stack(栈),queue(队列),priority_queue(优先队列)的使用(附完整程序代码)

首先,这三者都是顺序容器适配器(适配器(adaptor)是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型)。 本质上,适配器是使一事物的行为类似于另一事物的行为的一种机制。...
  • synapse7
  • synapse7
  • 2013年08月04日 22:40
  • 2858

STL 之 优先队列(priority_queue)

1、什么是优先队列        能够完成下列两种操作的数据结构,我们便称之为优先队列。        ①插入一个数值    ②取出最大(或者最小)的数值(获取数值,并且删除)。        从严格...
  • luomingjun12315
  • luomingjun12315
  • 2015年08月10日 06:48
  • 4231
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL之容器适配器:stack,queue , priority_queue
举报原因:
原因补充:

(最多只允许输入30个字)