码迷,mamicode.com
首页 > 编程语言 > 详细

C++队列

时间:2019-09-12 21:25:49      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:priority   list   eve   删除   返回值   技术   info   针对   堆排   

C++队列

默认已熟悉std::vectorvector是一个极其重要的模板,其中的每一个函数都应该了解其作用与用法,这里不再赘述。

双向队列

双向队列(std::deque)类似于vector,允许快速随机访问任何元素并在容器后面高效插入和删除。 但是,和矢量不同的是, deque还支持在容器前面高效插入和删除。使用时需加入头文件<deque>

deque虽名为队列,但是同时支持一些非队列操作。比如,deque::insertdeque::erase可在deque中的任意位置插入和删除元素。其常用的几个操作为deque::push_backdeque::pop_backdeque::push_frontdeque::pop_front,用来在队列头尾进行插入删除元素。

vector不同的是,deque不支持reserve。如果要提前分配空间,可利用构造函数或deque::resize分配空间并同时进行初始化。

队列

队列(std::queue)是一种先进先出的结构。相较与双向队列,它只保留了最必要的部分。默认使用deque作为核心数据成员,可以改为list

构造函数示例:

    std::deque<int> dque{ 1,2,3 };//deque,初始化列表,以下三个queue的核心数据成员类型,
    std::queue<int, std::deque<int>> que0;//默认构造
    std::queue<int, std::deque<int>> que2(que1);//复制构造
    std::queue<int, std::deque<int>> que1(dque);//使用const container_type&构造

接口:

成员函数 说明
back 返回尾元素(最后添加的元素)的引用
empty 返回bool,队列是否为空
front 返回首元素的引用
pop 无返回值,删除头元素
push 无返回值,在队列尾部添加一个元素
size 返回size_t,队列中元素的个数

优先队列

优先队列(std::priority_queue)是一种二叉堆结构,C++默认为最大堆。它不是先进先出,而是优先顺序最大者先出。优先队列默认使用vector作为核心数据成员。优先队列中某一节点的值要比其下所有节点值的优先顺序更高。

下图中的第一个子图是一个优先队列的示例,大值优先。队首为6,不小于任意其它元素,是整个队列的最大值。队列中的任意节点都不小于其直接或间接子节点的值。

技术图片

上图演示了队尾插入元素的过程,下图演示了删除队首元素的过程。

技术图片

若在第一步(右上图)中交换首尾元素而不是进行替换,就使最大值排在最后的位置。然后把队列的长度变量减1,不断重复此过程,就可以得到一个升序的序列。此方法被称为堆排序。

若从一个数组中构建一个优先队列,可以使用第一幅图中将元素一个个插入的方法,也可以使用如下的方法。

技术图片

priority_queue没有back接口,因为此位置的值是不确定的,有一个top接口对应front

int a[] = { 1,5,2,3,6,4 };
std::priority_queue<int, std::vector<int>, std::less<int>>dat(a, a + 6);

上面示例使用数组a中的元素构建了一个大值优先队列。尖括号中第一个int说明队列元素类型,第二个vector<int>说明队列的数据成员使用的是vector,最后一个less<int>说明队列是最大堆。less是一个类模板,但是重载了小括号,其行为类似于函数。在下面的示例中可以看到其实现细节。

struct AA
{
    int i;
    char c;
    //AA重载了小于,且两个参数都是const的,否则less中不能填入AA类型
    bool operator<(const AA& rval) const
    {return c < rval.c;}
};

struct BB//BB没有对操作符进行重载
{
    int i;
    char c;
};

std::priority_queue<AA, std::vector<AA>, std::less<AA> >pqAA;//char最大的排在队首

struct grt//针对BB类设计的仿std::greater类
{
    bool operator()(const BB& lval, const BB& rval)
    {return lval.c > rval.c;}
};
std::priority_queue<BB, std::vector<BB>, grt>pqBB;//char最小的排在队首

//BB的例子也可以这样写
auto cmp = [](const BB& lval, const BB& rval) {return lval.c > rval.c; };
std::priority_queue<BB, std::vector<BB>, decltype(cmp)>pqBB(cmp);

优先规则的确定在于,在尖括号中输入一个类名,构造函数中给出该类的一个对象,使用该对象应该能够对队列中的元素进行比较。若构造函数中将其省略,默认造成的对象能否依旧完成此任务。对于grt,其默认生成的对象也能进行BB之间的比较,而对于lambda,它接收两个const BB&返回bool。但如果定义一个此类型的对象,我们知道它可以对BB进行比较,但是却不知道比较规则,因此队列构造函数中的的对应参数就不能省略。

C++队列

标签:priority   list   eve   删除   返回值   技术   info   针对   堆排   

原文地址:https://www.cnblogs.com/xunxunxun/p/11515088.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!