zoukankan      html  css  js  c++  java
  • c++ priority_queue

    平常使用queue,今天遇到一个priority_queue,记录一下啊

    queue:

      是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。

    priority_queue:

            元素按照优先级排序了,当访问元素时,具有最高优先级的元素最先pop。优先队列具有最高级先出 (first in, largest out)的行为特征。

            优先队列具有queue的所有特性,包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。

             参考:c++二叉堆

    先看看简单的例子:

    class QueData
    {
    public:
    	QueData(int data, string name) :m_data(data), m_strName{ name } {
    		;
    	}
    	virtual ~QueData() { ; }
    
    public:
    	bool operator < (const QueData &data) const  //注意此处重载函数后面的const,曾经遇到过const没加上,报错问题
    	{
    		return m_data < data.m_data;
    	}
    
    	string name() { return m_strName; }
    	int data() { return m_data; }
    
    private:
    	int m_data = 0;
    	string m_strName{ "" };
    };
    
    
    
    
    #include <queue>
    #include <functional>  //std::greater
    void testPriorityQue()
    {
    	std::cout << "From large to small, default: less" << std::endl;
    	std::priority_queue<int> priorityQueInt;
    	//等同于: 
    	//priority_queue<int, std::vector<int>, std::less<int> > priorityQueInt;
    	priorityQueInt.push(8);
    	priorityQueInt.push(6);
    	priorityQueInt.push(7);
    	priorityQueInt.push(9);
    	priorityQueInt.push(10);
    
    	//默认由大到小
    	while(!priorityQueInt.empty())
    	{
    		std::cout << priorityQueInt.top() << std::endl;
    		priorityQueInt.pop();
    	}
    ///////////////////////////
    std::cout << "From small to large, use: greater" << std::endl; //更改到-->小到大: std::priority_queue<int, std::vector<int>, std::greater<int> > priorityGreaterQueInt; priorityGreaterQueInt.push(8); priorityGreaterQueInt.push(6); priorityGreaterQueInt.push(7); priorityGreaterQueInt.push(9); priorityGreaterQueInt.push(10); while (!priorityGreaterQueInt.empty()) { std::cout << priorityGreaterQueInt.top() << std::endl; priorityGreaterQueInt.pop(); } /////////////////////// std::cout << "For customize type defined, use override operator <" << std::endl; std::priority_queue<QueData> que; QueData data8{ 8,"8" }; que.push(data8); QueData data6{ 6,"6" }; que.push(data6); QueData data7{ 7,"7" }; que.push(data7); QueData data9{ 9,"9" }; que.push(data9); QueData data10{ 10,"10" }; que.push(data10); //大小顺序由QueData的operator <决定 while (!que.empty()) { QueData queData = que.top(); std::cout << queData.data() << std::endl; que.pop(); } } int main() { testPriorityQue(); return 0; }

    输出:

    From large to small, default: less
    10
    9
    8
    7
    6
    From small to large, use: greater
    6
    7
    8
    9
    10
    For customize type defined, use override operator <
    10
    9
    8
    7
    6
    Press any key to continue . . .

      

    定义:http://www.cplusplus.com/reference/queue/priority_queue/?kw=priority_queue

      priority_queue<Type, Container, Functional>

      Type :         数据类型, 基本类型或者自定义类

      Container : 容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector)

           Functional :比较的方式, 自定义类型 通过override  operator <实现,

                   基本类型,stl functional提供了greater和less来比较大小,

                          greater和less是std实现的两个仿函数, 其实现就是类中实现一个operator(),具体可以查看functional

    当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,不填,默认是less,从大到小

    复制代码
    1 //默认:大->小,大顶堆
    std::priority_queue<int> priorityQueInt;
    priority_queue<int, std::vector<int>, std::less<int> > priorityQueInt;

    2 //小->大,小顶堆 
    std::priority_queue<int, std::vector<int>, std::greater<int> > priorityGreaterQueInt;
    复制代码
  • 相关阅读:
    split a string into an array through comma
    正则表达式替换日期
    在Ajax1.0中调用页面CS文件中的方法
    半透明的div对话框
    foreach 的自动转化类型
    ViewStateAutoManager
    using ISerializable to control serialization and deserialization
    div with separated html template
    2018.9.9作业
    CSS单位
  • 原文地址:https://www.cnblogs.com/leehm/p/12893820.html
Copyright © 2011-2022 走看看