服务端视角的C++从入门到精通(六)

143 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

优先队列的简单用法

这里我们先看一下C++标准库中对于优先队列的声明:

template<typename _Tp, typename _Sequence = vector<_Tp>,
	 typename _Compare  = less<typename _Sequence::value_type> >
    class priority_queue
    {
        ...
    }

这种头上顶着一个template关键字类,就可以用<>将需要指定的类型放在里面,这样才成为一个完整的、具体的类型。这种编程范式在C++语言中叫做“泛型”,英文是Generic programming。我个人理解“泛型”是相对于基本数据类型、结构体这种类型别名而言的,后者它们笼统地来说都可以算是具体的类型,所以“泛型”重在体现“泛”上,可以理解为“广泛”、“通用”等含义。在上面这段代码中,_Tp可以简单理解为一个占位符,它跟在typename后面,表示自己这个模板参数的位置应该放一种数据类型,后面的_Tp也都会根据前面已经填入的数据类型而进行自动推导。这里的自动推导就有点类似于auto。原先我们的编程模式可能更多地是先指定变量的数据类型,然后给这个变量赋对应数据类型的值,当然这中间还有一些隐式转化之类的规则,在此不展开来讲。_Compare是比较_Tp用的仿函数,默认是less,也就是大顶堆。这里有个套娃的操作,可以看到第二个模板参数的名字是_Sequence,而第三个参数又用了第二个参数作为它的工具,用::value_type来推导出_Sequence中的元素类型,来作为less中真正的数据类型,其实这里理论上等价于typename _Compare = less<typename _Tp>,这里之所以写成这样,应该是因为在STL中约定俗成的做法。

priority_queue中常用的方法包括push()pop()top(),以及是个容器(vector就是个容器)都有的size()empty()通用方法。