简介

这个头文件定义了两个跟队列有关的类----quque、priority_queue,分别实现的是队列优先队列这两个概念。 但是与这两个类模版与其它类模版(vector、array等)最大的不同是,它们是 容器适配器

容器适配器

顾名思义,容器适配器是对容器的适配,从代码层面来讲,它就是对容器的再封装。 因此,这些容器适配器实际上都是由其他容器的功能实现的。 不难看出, 容器适配器所具有的功能是内部容器功能的子集

普通的类封装一般是为了封装成特定问题领域下的类,提供特定的接口,以解决开发中遇到的实际问题为主要目的; 而作为一门语言库中的库类,它们更多考虑的是可重用性,所以库类一般封装成像stack、quque等具有抽象性的概念。

队列

你可以把队列看成一种被适配的容器,它有两个重要的特性:

  • FIFO(first-in first-out): 先入队的元素总是先出队。
  • 两端出入: 元素从一端入队,从另一端出队。

操作对应的成员函数

  • 入队 -> push
  • 出队 -> pop

为什么少了很多常见函数

细心的你们肯定发现了,queue类模版提供的函数很少,一些非常常见的函数都没有。 如果让我用一句话来解释的话,那就是----所有涉及头尾两端外的位置的函数,都不在队列的概念内!

因为在队列中,所有元素的存取都只能通过入队和出队操作。 如果你想获取位于中间位置的元素,那么对不起,你只能先把前面的元素取出来;如果你想对队中的元素本身进行操作,抱歉,你得先获取它(当然,然,出于实际上的方便使用,queue类模版还是包含了一些本不在概念内的函数:size、back等)。 在队列上的操作是非常有限的,所以队列只在一些特殊且适合情况下才被使用。

那这些消失的函数都包括哪些呢?

  1. 所有Iterator函数: 没错,是所有,你没有看错! 因为所有迭代器都可以通过步进(advance函数或者算数加减)操作,从而指向队列中间的元素。
  2. 更改大小的非pop非push函数(包括增加和删除): 队列大小的改变只能被入队出队操作影响。
  3. 所有随机存取函数 : 元素的获取只能按序,而获取是操作的前提。

优先队列

优先队列也是一中容器适配器,这种队列主要具有以下两个性质:

  • 按优先级排序
  • 按优先级获取

在优先队列中,所有的元素都是按照优先级排序。 具体来说,当每一次元素入队时,都会对队列进行优先级排序,优先级最高的排在最前面,优先级最低的排在最后面。 而获取元素时,只能按优先级从高到底依次获取。

从某种意义上来说,队列(queue)和 优先队列(priority_queue)是相似的,甚至可以说 队列是优先队列的特殊情况。 它们都按照某种规律排序,只是排序的规则不同: 队列按元素的入队时间排序,优先队列按元素优先级排序。

优先级

那么如何定义该种队列的优先级呢? 在声明优先队列对象的时候,你可以传递一个二元谓词(Binary Predicate)来执行排序的任务。 如果你不传递自定义的二元谓词,则优先队列默认使用functional头文件中的less函数对象。

这个二元谓词执行严格弱序排序(Strick Weak Ordering)。这个排序有以下四个属性(假设comp为比较操作,x、y、z为待比较的元素, x non-comp y等价于(x comp y) == false && (x comp y) == false)):

  • 自反性((x comp x) == false)
  • 不对称性((x comp y) != (y comp x))
  • 传递性(((x comp y) == true, (y comp z) == true)) => ((x comp z) == true)))
  • 不可比性((x non-comp y, y non-comp z) => (x non-comp z))

这着实有点晦涩,搞得我都头晕了。 简单的讲,这个二元谓词比较两个元素,如果第一个比较的元素应该排在第二个前面(即第一个元素的优先级高于第二个),那么它返回true。 元素的相等性也是通过这个谓词操作推出来的:如果第一个元素的优先级不高于第二个元素,并且第二个元素的优先级也不高于第一个元素,那么这两个元素就相等。

操作对应的函数

  • 入队 -> push
  • 出队 -> pop

值得注意的是,不像队列那样,优先队列里的元素没有时间前后之分,所以priority_queue模版类去掉了front和back成员函数,代之以top函数,用以指代下一个出队的优先级最高的元素。

C++ 头文件系列(queue)的更多相关文章

  1. C++ 头文件系列(array)

    注意,该头文件仅在C++11中标准才开始出现. 简介 与语言内置的数组一样, array类模版支持几乎所有内置数组包含的特性: 顺序的(sequence) 内存连续的(contiguous stora ...

  2. C++ 头文件系列(stack)

    简介 该头文件只含有一个类模版stack, 它实现栈的概念,是一个容器适配器(说实话,在写这篇随笔之前我都不知道有这么个类模版). 栈 栈只有一个重要的特性: LIFO(last-in first-o ...

  3. C++ 头文件系列(vector)

    简介 vector头文件包含vector的类模版以及该模版的显示特化版本vector< bool >. vector是C++容器库中非常通用的一种容器,如果你不知道该决定使用哪一种容器,或 ...

  4. C++ 头文件系列(map)

    简介 该头文件包含两个概念相似的容器----map.multimap. 而这两个容器反映的概念就是 映射. 这两个容器 相同 的属性有: 关联性 映射 动态增长 键(Key)唯一性 这两个不相同的属性 ...

  5. C++ 头文件系列(unordered_map、unordered_set)

    简介 很明显,这两个头文件分别是map.set头文件对应的unordered版本. 所以它们有一个重要的性质就是: 乱序 如何乱序 这个unorder暗示着,这两个头文件中类的底层实现----Hash ...

  6. C++ 头文件系列(iterator)

    简介 该头文件围绕迭代器展开,定义了一系列与迭代器有关的概念,但最最最重要的一点就是----它和其它容器一起实现了C++容器的Iterator设计模式. Iterators are a general ...

  7. C++ 头文件系列 (algorithm)

    简介 algorithm头文件是C++的标准算法库,它主要应用在容器上. 因为所有的算法都是通过迭代器进行操作的,所以算法的运算实际上是和具体的数据结构相分离的 ,也就是说,具有低耦合性. 因此,任何 ...

  8. C++ 头文件系列 (bitset)

    简介 该头文件有关位集,实际上是vector 位 位本质上对应bool的概念,只有0或1,true或false两种对立的值. 但很可惜,字节才是机器上最小的存储单元,所以bool基本上是由一个字节大小 ...

  9. C++ 头文件系列(iosfwd)

    简介 输入输出历来都是语言的重要部分,在C++中,该库也是占据了相当大的一部分. C++的输入输出库是其遵循面向对象设计的结果,并结合了泛型编程. 以下是这些库类的关系图(箭头标示继承,白框表示摸板, ...

随机推荐

  1. 快速构建Windows 8风格应用6-GridView数据控件

    原文:快速构建Windows 8风格应用6-GridView数据控件 本篇博文主要介绍什么是GridView数据控件.如何构建常用的GridView数据呈现样式. 什么是GridView数据控件? G ...

  2. js 实现自动换行

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. leetcode[61] Unique Paths

    题目:给定一个m*n的矩阵,从头开始,只能往右边和下边走,一次走一格,知道走到最后一个(右下角)为止.总共有多少种走法. 典型的动态规划吧.其实从头走到尾部,和从尾部开始走到头是一样的次数.我们用一个 ...

  4. [Usaco2008 Feb]Line连线游戏[暴力][水题]

    Description Farmer John最近发明了一个游戏,来考验自命不凡的贝茜.游戏开始的时 候,FJ会给贝茜一块画着N (2 <= N <= 200)个不重合的点的木板,其中第i ...

  5. MvcMovieStore实例 教程

    转原创:MvcMovieStore 实例教程(新概念版:mvc5.0,EF6.01)-初露锋芒 如需转载,请注明出处:http://www.cnblogs.com/DoduNet/ 最近趁业余时间,把 ...

  6. 企业架构研究总结(35)——TOGAF架构内容框架之构建块(Building Blocks)

    之前忙于搬家移居,无暇顾及博客,今天终于得闲继续我的“政治课”了,希望之后至少能够补完TOGAF方面的内容.从前面文章可以看出,笔者并无太多能力和机会对TOGAF进行理论和实际的联系,仅可对标准的文本 ...

  7. IE回车的怪异行为

    问题 IE浏览器在input中回车,会触发button按钮的click事件. 原因分析 IE浏览器中在input中回车相当于提交form,而button标签默认的类型是submit, 所以如果没有指定 ...

  8. 用django搭建一个简易blog系统(翻译)(二)

    03. Starting the blog app 在这部分,将要为你的project创建一个blog 应用,通过编辑setting.py文件,并把它添加到INSTALLED_APPS. 在你的命令行 ...

  9. Object-c学习之路三(@class与#import的区别)

    //@class只是为了声明B是一个类  当两个类相互包含的时候#import是做不到的 //一般在.h文件中用@class声明一个类成员 在..m文件中具体用到时才用#import应用 //二者区别 ...

  10. 瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!

    纯手工打造漂亮的瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!   前两天写的文章<纯手工打造漂亮的垂直时间轴,使用最简 ...