分类: Learning C++2013-11-15 00:52 843人阅读 评论(2) 收藏 举报

STL 中栈的使用方法(stack)

#include <stack>

基本操作:

push(x) 将x加入栈中,即入栈操作

pop() 出栈操作(删除栈顶),只是出栈,没有返回值

top() 返回第一个元素(栈顶元素)

size() 返回栈中的元素个数

empty() 当栈为空时,返回 true

 
STL 中队列的使用(queue)
#include <queue>

基本操作:

push(x) 将x压入队列的末端

pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值

front() 返回第一个元素(队顶元素)

back() 返回最后被压入的元素(队尾元素)

empty() 当队列为空时,返回true

size() 返回队列的长度

----------  栈和队列的用法都相对简单,下面详细介绍优先队列的用法 -----------

STL 中优先队列的使用详细介绍(priority_queu)

#include <queue>

基本操作:

empty() 如果队列为空返回真

pop() 删除对列首元素

push() 加入一个元素

size() 返回优先队列中拥有的元素个数

top() 返回优先队列首元素

在默认的优先队列中,优先级高的先出队。

标准库默认使用元素类型的 < 操作符来确定它们之间的优先级关系。

 

(1)优先队列的第一种用法,这是最常用的默认的优先级用法,也就是优先级高的先出队列,例如说一个int优先队列,那么出队的时候就是int大的先出队列。

下面给出一个例子:

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. int main()
  5. {
  6. priority_queue<int> q;
  7. for(int i = 1;i <= 5;i++)
  8. {
  9. q.push(i);
  10. }
  11. for(int i = 0;i < 5;i++)
  12. {
  13. cout<<q.top()<<endl;
  14. q.pop();
  15. }
  16. return 0;
  17. }

运行结果可想而知,就是从大到小的: 5 4 3 2 1

(2)那么如果想要优先队列中低优先级的元素先出队列,怎么办呢? --- 自定义优先级

①方法一:我们可以传入一个比较函数,使用functional头文件中的greater函数对象作为比较函数

注意:首先要添加头文件:#include <functional>

priority_queue< int,vector<int>,greater<int> > q; // 注意:> > 误写成>> 会报错

这样我们就创建了一个低优先级元素先出对列的优先队列。

修改上面的例子,运行,就会发现,输出的顺序变成了:1 2 3 4 5。

当然,与greater相对的less,如果传入less这个比较函数,那么就是高优先级元素先出队列了。

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

priority_queue<int> q;

以上创建的优先队列是相同的。

②方法二:自己实现比较函数

  1. struct cmp1
  2. {
  3. bool operator ()(int x,int y)
  4. {
  5. return x>y; //小值优先
  6. }
  7. };

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

这样就创建了一个小值元素先出队列的优先队列,这里的 cmp1 作用就相当于 greater

同理我们可以写出:

  1. struct cmp2
  2. {
  3. bool operator ()(int x,int y)
  4. {
  5. return x<y; //大值优先
  6. }
  7. };

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

这里就是创建了一个大值元素先出队列的优先队列,这里的 cmp2 作用也就是相当于 less

(3)假如优先队列中的元素是一个结构对象或者是类对象,那么如何重新自定义其优先级比较呢?

例子一:定义一个结构体,这个结构体只有一个元素 x 。

①低优先级元素先出队列,也就是x值小的先出队列。

  1. struct number1
  2. {
  3. int x;
  4. bool operator < (const number1 &a) const
  5. {
  6. return x>a.x;//小值优先
  7. }
  8. };
  1. number1 num1[5];
  2. priority_queue<number1>q;
  3. for(int i = 1; i <= 5; i++)
  4. {
  5. num1[i].x = i;
  6. q.push(num1[i]);
  7. }
  8. for(int i = 1; i <= 5; i++)
  9. {
  10. cout<<q.top().x<<endl;
  11. q.pop();
  12. }

输出: 1 2 3 4 5

②高优先级元素先出队列,也就是x值大的先出队列。

  1. struct number2
  2. {
  3. int x;
  4. bool operator < (const number2 &a) const
  5. {
  6. return x<a.x;//大值优先
  7. }
  8. };

注意到:结构体中重载的运算符只可以是 <, 因为标准库默认使用元素类型的 < 操作符来确定它们之间的优先级关系,如果重载 > ,那么会编译错误。

例子二:在上面的例子中,我们是将 结构体中的 x 的大小当做是优先级比较值了。下面给出另一例子,这个例子更具有一般性。

  1. struct node
  2. {
  3. friend bool operator < (node n1, node n2)
  4. {
  5. return n1.priority < n2.priority;
  6. }
  7. int priority;
  8. int value;
  9. };

在这个结构体中,priority表征优先级值。

  1. priority_queue<node> qn;
  2. node b[5];
  3. b[0].priority = 6; b[0].value = 1;
  4. b[1].priority = 9; b[1].value = 5;
  5. b[2].priority = 2; b[2].value = 3;
  6. b[3].priority = 8; b[3].value = 2;
  7. b[4].priority = 1; b[4].value = 4;
  8. for(int i = 0; i < 5; i++)
  9. qn.push(b[i]);
  10. cout<<"优先级"<<'\t'<<"值"<<endl;
  11. for(int i = 0; i < 5; i++)
  12. {
  13. cout<<qn.top().priority<<'\t'<<qn.top().value<<endl;
  14. qn.pop();
  15. }

输出结果为:
优先级  值
9          5
8          2
6          1
2          3
1          4

STL 优先队列的更多相关文章

  1. CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆)

    CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆) Description 有n个函数,分别为F1,F2,...,Fn.定义 \(Fi(x)=Aix^2+Bix ...

  2. CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)

    CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...

  3. 基于STL优先队列和邻接表的dijkstra算法

    首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...

  4. poj 3253 Fence Repair (STL优先队列)

    版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/34805369 转载请注明出 ...

  5. UVA - 136 Ugly Numbers(丑数,STL优先队列+set)

    Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9 ...

  6. 合并果子(STL优先队列)

    STL优先队列:priority_queue 定义:priority_queue<int>q; 从小到大:priority_queue<int,vector<int>,g ...

  7. STL优先队列的使用

    STL中有一个优先队列的容器可以使用. [头文件] queue 队列容器 vector 向量容器 [操作] 优先级队列支持的操作 q.empty()         如果队列为空,则返回true,否则 ...

  8. POJ 3253 Fence Repair STL 优先队列

    这题做完后觉得很水,主要的想法就是逆过程思考,原题是截断,可以想成是拼装,一共有n根木棍,最后要拼成一根完整的,每两根小的拼成一根大的,拼成后的木棍长度就是费用,要求费用最少.显然的是一共会拼接n-1 ...

  9. STL优先队列——踩坑日记

    priority_queue 可以定义STL中的优先队列,但是优先队列在应用于自己定义的类型时需要重载<运算符,或者通过仿函数来定义比较方法,在定义比较方法的过程中,比较大的坑是STL中对于参数 ...

随机推荐

  1. 让C# Excel导入导出,支持不同版本的Office

    问题:最近在项目中遇到,不同客户机安装不同Office版本,在导出Excel时,发生错误. 找不到Excel Com组件,错误信息如下. 未能加载文件或程序集“Microsoft.Office.Int ...

  2. WPF嵌入百度地图完整实现

    无论是做App还是web开发,很多都会用到地图功能,一般都会调用第三方的API实现地图功能!而正如国内的地图API提供方,基本上对Android.IOS和web开发提供了很完整的一套API,但是对于桌 ...

  3. Java创建线程的第二种方式:实现runable接口

    /*需求:简单的卖票程序多个窗口买票 创建线程的第二种方式:实现runable接口 *//*步骤1.定义类实现Runable接口2.覆盖Runable接口中的run方法    将线程要运行的代码存放在 ...

  4. linux shell编程学习笔记(一)---通配符,元字符

    linux通配符: 通配符是由shell处理的(不是由所涉及到命令语句处理的,其实我们在shell各个命令中也没有发现有这些通配符介绍), 它只会出现在 命令的“参数”里(它不用在 命令名称里, 也不 ...

  5. 【Linux工具】svn命令行使用实例

    引言 网上有这么多介绍 svn 使用的文章,为什么还要写?因为它们深入不浅出,平铺不分类,理论不实际,看完也记不住. 本文先介绍基本用法,后进行实例演练.不求大而全,只求熟练常用,自行用 svn he ...

  6. 链表C++模板实现

    #include <iostream.h> #include <stdlib.h> //结点模板类 template <typename t1, typename t2& ...

  7. jQuery实例-简单选项卡-【一些常见方法(2)-练习】

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. centos 端口开放及关闭

    之前有讲过公司新买的服务器使用的是CentOS 5.5,部署好Tomcat之后却发现输入114.80.*.*:8080(即ip:8080)却无法显示Tomcat默认的首页.因为以前部署在Win Ser ...

  9. (转载)c++builder/delphi中透明panel及透明窗口的实现方法_delphi教程

    c++builder/delphi中透明panel及透明窗口的实现方法_delphi教程 可能大多数程序员会问:透明窗口,特别是透明Panel有什么应用价值呢?可别小看它们哦,下面我就来讲讲他们的巨大 ...

  10. NodeJS+ExpressJS+SocketIO+MongoDB应用模板

    OS:Win8.1 with update 关键字:NodeJS,ExpressJS,SocketIO,MongoDB. 1.源代码下载:https://github.com/ldlchina/ESM ...