1. 队列

queue 队列是一种容器适配器,专门用来满足先进先出的操作,也就是元素在容器的一端插入并从另一端提取。

  • bool empty() const; 返回队列是否为空;
  • size_type size() const; 返回队列中元素的数量;
  • reference& back(); 返回队列中最后一个元素也即最新的元素的引用;
  • reference& front(); 返回队列中的下一个元素也即最旧的元素的引用;
  • void push (const value_type& val); 在队尾插入一个元素;
  • void pop(); 弹出队列的下一个元素也即最旧的元素,队头元素。

2. 优先级队列

优先级队列是一种容器适配器,根据一些严格的弱排序标准,专门设计使其第一个元素始终是它包含的最值元素。其本质上就是一个大顶堆或者小顶堆,会在需要时自动调用函数 make_heap,push_heap 和 pop_heap 自动完成堆化,比如插入新元素或者弹出堆顶元素。

  • bool empty() const; 返回优先级队列是否为空;
  • size_type size() const; 返回优先级队列中元素的数量;
  • const_reference top() const; 返回优先级队列的顶部元素,也即比较优先级最高的元素;
  • void push (const value_type& val); 在优先级队列中插入一个元素;
  • void pop(); 弹出优先级队列的顶部元素。

下面的例子中展示了构建优先级队列,将两个降序的 vector 合并成一个新的降序的 vector。

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

class mycomparison
{
    bool big_heap; // 大顶堆标志位,也就是所有元素比堆顶元素小
public:
    mycomparison(const bool& param=true)
    {big_heap = param;}
    bool operator() (const vector<int> vec1, const vector<int> vec2) const
    {
        if (big_heap) return (vec1[0] < vec2[0]);
        else return (vec1[0] > vec2[0]);
    }
};

int main ()
{
    vector<int> vec1;
    vec1.push_back(200);
    vec1.push_back(50);
    vec1.push_back(32);

    vector<int> vec2;
    vec2.push_back(100);
    vec2.push_back(96);
    vec2.push_back(20);

    vector<int> vec3;

    // priority_queue<vector<int>, vector< vector<int>>, mycomparison> q(mycomparison(false));
   // priority_queue<vector<int>, vector< vector<int>>, mycomparison> q(false);
    priority_queue<vector<int>, vector< vector<int>>, mycomparison> q;

    q.push(vec1);
    q.push(vec2);

    while (!q.empty())
    {
        vector<int> temp = q.top();
        q.pop();
        vec3.push_back(temp[0]);
        temp.erase(temp.begin());
        if (temp.size() != 0) q.push(temp);
    }

    for (vector<int>::iterator it = vec3.begin(); it != vec3.end(); it++) cout << *it << ' ';

    return 0;
}

参考资料 [http://www.cplusplus.com]

获取更多精彩,请关注「seniusen」!

C++ 学习笔记之——STL 库 queue的更多相关文章

  1. C++ 学习笔记之——STL 库 vector

    vector 是一种顺序容器,可以看作是可以改变大小的数组. 就像数组一样,vector 占用连续的内存地址来存储元素,因此可以像数组一样用偏移量来随机访问,但是它的大小可以动态改变,容器会自动处理内 ...

  2. 学习笔记:STL

    第一部分:(参考百度百科) 一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Me ...

  3. iOS学习笔记16-数据库SQLite

    一.数据库 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等.离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式: 归档:NSKeyedArchiver 偏好设置:NSU ...

  4. C++ 学习笔记之 STL 队列

    一.  引言 在算法以及数据结构的实现中,很多地方我们都需要队列(遵循FIFO,先进先出原则). 为了使用队列,我们可以自己用数组来实现队列,但自己写太麻烦不说,并且还很容易出错. 好在C++的STL ...

  5. 重温JSP学习笔记--JSTL标签库

    以前写jsp的时候对jstl标签库是有些抵触的,因为我觉得嵌入java代码的方式几乎无往不利,没有必要使用标签库,不过这次复习还是好好地学习了一下,发现这个还是很有用处的,用得好能省不少事,JSTL是 ...

  6. OpenGL学习笔记0——安装库

    最近需要做一个基于Zigbee室内无线定位的系统,受到TI公司ZigBee Sensor Monitor软件的启发,打算用OpenGL来做一个3D显示空间内物体位置的程序.学习阶段选择VS2010+O ...

  7. 学习笔记_Java_day13_JSTL标签库(1、2、3、4、5、6、7、8)

    1.一种标签语言 day13 l  JSTL标签库(重点) l  自定义标签(理解) l  MVC设计模式(重点中的重点) l  Java三层框架(重点中的重点) JSTL标签库 1 什么是JSTL ...

  8. C++ Primer学习笔记2--c++标准库中的 vector、string 和 bitset 类型

    一.string    #include <string>  using std::string    初始化函数:    string s1;        默认构造函数 s1 为空串 ...

  9. 学习笔记CB001:NLTK库、语料库、词概率、双连词、词典

    聊天机器人知识主要是自然语言处理.包括语言分析和理解.语言生成.机器学习.人机对话.信息检索.信息传输与信息存储.文本分类.自动文摘.数学方法.语言资源.系统评测. NLTK库安装,pip insta ...

随机推荐

  1. ABAP开发顾问必备:SAP ABAP开发技术总结[转载]

    转载自SAP师太技术博客,原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 在原文上增加了链接,此文及此文的链接版权都归SAP师太所有. ...

  2. Ubuntu 16.04 搭建 ELK

    1.安装Java JDK sudo apt-get install default-jdk 2.安装Elasticsearch 1.导入Elasticsearch的GPG公钥 wget -qO - h ...

  3. linux中删除文件内空白行的几种方法。

    linux中删除文件内空白行的几种方法 有时你可能需要在 Linux 中删除某个文件中的空行.如果是的,你可以使用下面方法中的其中一个.有很多方法可以做到,但我在这里只是列举一些简单的方法. 你可能已 ...

  4. 01-http简介-四层 七层 三次握手

    HTTP简介.请求方法与响应状态码 接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的.接下来的几篇博客都是关于T ...

  5. JS 创建对象总结

    狭义:new 构造函数. (注:在JS中创建对象只有一种方式,就是new 构造函数.其中字面量的方式是一种语法糖,本质仍然是new 构造函数) 广义:工厂模式(解决复杂度) 构造函数模式(解决复杂度, ...

  6. [翻译]Hystrix wiki–Home

    注:本文并非是精确的文档翻译,而是根据自己理解的整理,有些内容可能由于理解偏差翻译有误,有些内容由于是显而易见的,并没有翻译,而是略去了.本文更多是学习过程的产出,请尽量参考原官方文档. 什么是Hys ...

  7. PHP在foreach中对$value赋值

    foreach ($data as $key => $value) { $data[$key]['name'] = '测试在value中赋值';}

  8. 解决thinkphp query()执行原生SQL语句成功结果报错的问题

    1.query方法 query方法用于执行SQL查询操作,如果数据非法或者查询错误则返回false,否则返回查询结果数据集(同select方法). 2.execute方法 execute用于更新和写入 ...

  9. Linux常用97条命令

    1.ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a  列出包括.a开头的隐藏文件的所有文件 -A  通-a,但不列出"."和".." -l  ...

  10. java读写HDFS

    package cn.test.hdfs;   import java.io.IOException; import java.net.URI; import java.net.URISyntaxEx ...