91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中priority_queue如何實現

發布時間:2021-08-30 09:15:00 來源:億速云 閱讀:116 作者:小新 欄目:開發技術

小編給大家分享一下C++中priority_queue如何實現,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

    priority_queue概述

    priority_queue定義

    • 優先級隊列是不同于先進先出隊列的另一種隊列。每次從隊列中取出的是具有最高優先權的元素。

    priority_queue特點

    • 優先隊列是一種容器適配器,首先要包含頭文件 #include<queue>, 他和queue不同的就在于我們可以自定義其中數據的優先級, 讓優先級高的排在隊列前面,優先出隊。

    • 優先級隊列默認使用vector作為其底層存儲數據的容器,在vector上又使用了堆算法將vector中元素構造成堆的結構,因此priority_queue就是堆,所有需要用到堆的位置,都可以考慮使用priority_queue。

    • 注意:默認情況下priority_queue是大根堆。如果想讓其生成小根堆,需要使用到仿函數或者Lambda表達式。

    構造函數

    由于priority_queue是一種容器適配器,適配的是vector,我們在vector中已經寫過它的構造函數了。故priority_queue在此不需要多余的其他構造函數。

    // 創造空的優先級隊列
    priority_queue():m_priority_queue()
    {
    
    }
    
    template<class Iterator>
    priority_queue(Iterator first, Iterator last)
    	: m_priority_queue(first, last)
    {
    	// 將m_priority_queue中的元素調整成堆的結構
    	int count = m_priority_queue.size();
    	int root = ((count - 2) >> 1);
    	for (; root >= 0; root--)
    	AdjustDown(root);
    }

    修改相關函數

    push

    功能:push函數用來往堆中(尾部)插入一個元素,并向上調整成新的堆。

    //向上調整
    void AdjustUp(int child)
    {
    	int parent = (child-1)>>1;
    	
    	while (child > 0)
    	{
    		//其中c是一個對象,用該對象去調用仿函數來進行比較
    		if (c(m_priority_queue[parent], m_priority_queue[child]))
    		{
    			std::swap(m_priority_queue[parent], m_priority_queue[child]);
    			child = parent;
    			parent = (child - 1) >> 1;
    		}
    		else
    		{
    			break;
    		}
    	}
    
    }
    
    void push(const T& val)
    {
    	m_priority_queue.push_back(val);
    	AdjustUp(m_priority_queue.size()-1);
    }

    pop

    功能:pop函數彈出堆頂元素。具體步驟是:堆頂元素與最后一個數字進行交換位置。之后在進行尾刪來刪除堆頂。再重新向下調堆。

    //向下調堆
    void AdjustDown(int parent)
    {
    	int child = (parent << 1) + 1;
    	int size = static_cast<int>(m_priority_queue.size());
    
    	while (child< size)
    	{
    		if (child + 1 < size && c(m_priority_queue[child],m_priority_queue[child + 1]) )
    		{
    			++child;
    		}
    
    		if (c(m_priority_queue[parent], m_priority_queue[child]))
    		{
    			std::swap(m_priority_queue[parent], m_priority_queue[child]);
    			parent = child;
    			child = (parent << 1) + 1;
    		}
    		else
    		{
    			break;
    		}
    	}
    }
    
    void pop()
    {
    	assert(!m_priority_queue.empty());
    
    	std::swap(m_priority_queue[0], m_priority_queue[m_priority_queue.size()- 1]);
    	m_priority_queue.pop_back();
    	AdjustDown(0);
    }

    容量相關函數

    size

    功能:用來獲取堆中的元素個數。

    size_t size()	const
    {
    	return m_priority_queue.size();
    }

    empty

    功能:用來判斷堆中是否為空。

    bool empty()	const
    {
    	return m_priority_queue.empty();
    }

    元素訪問相關函數

    top

    功能:用來獲取堆頂的元素。

    T& top()
    {
    	return m_priority_queue.front();
    }
    
    const T& top()	const
    {
    	return m_priority_queue.front();
    }

    代碼實現

    #pragma once
    #define _CRT_SECURE_NO_WARNINGS 1
    #include<iostream>
    #include<vector>
    #include<assert.h>
    namespace ZJ
    {
    	template<class T>
    	class less
    	{
    	public:
    		bool operator() (const T& x, const T& y) const
    		{
    			return x < y;
    		}
    	};
    
    	template<class T>
    	class greater
    	{
    	public:
    		bool operator() (const T& x, const T& y) const
    		{
    			return x > y;
    		}
    	};
    	template<class T,class Container=std::vector<T>, class Compare = ZJ::less<T>>
    	class priority_queue
    	{
    	public:
    		// 創造空的優先級隊列
    		priority_queue():m_priority_queue()
    		{
    
    		}
    
    		template<class Iterator>
    		priority_queue(Iterator first, Iterator last)
    			: m_priority_queue(first, last)
    		{
    			// 將m_priority_queue中的元素調整成堆的結構
    			int count = m_priority_queue.size();
    			int root = ((count - 2) >> 1);
    			for (; root >= 0; root--)
    			AdjustDown(root);
    		}
    	public:
    
    		//向上調整
    		void AdjustUp(int child)
    		{
    			int parent = (child-1)>>1;
    			
    			while (child > 0)
    			{
    				if (c(m_priority_queue[parent], m_priority_queue[child]))
    				{
    					std::swap(m_priority_queue[parent], m_priority_queue[child]);
    					child = parent;
    					parent = (child - 1) >> 1;
    				}
    				else
    				{
    					break;
    				}
    			}
    
    		}
    		void push(const T& val)
    		{
    			m_priority_queue.push_back(val);
    			AdjustUp(m_priority_queue.size()-1);
    		}
    
    		void AdjustDown(int parent)
    		{
    			int child = (parent << 1) + 1;
    			int size = static_cast<int>(m_priority_queue.size());
    
    			while (child< size)
    			{
    				if (child + 1 < size && c(m_priority_queue[child],m_priority_queue[child + 1]) )
    				{
    					++child;
    				}
    
    				if (c(m_priority_queue[parent], m_priority_queue[child]))
    				{
    					std::swap(m_priority_queue[parent], m_priority_queue[child]);
    					parent = child;
    					child = (parent << 1) + 1;
    				}
    				else
    				{
    					break;
    				}
    			}
    		}
    
    		void pop()
    		{
    			assert(!m_priority_queue.empty());
    
    			std::swap(m_priority_queue[0], m_priority_queue[m_priority_queue.size()- 1]);
    			m_priority_queue.pop_back();
    			AdjustDown(0);
    		}
    
    		size_t size()	const
    		{
    			return m_priority_queue.size();
    		}
    
    		T& top()
    		{
    			return m_priority_queue.front();
    		}
    
    		const T& top()	const
    		{
    			return m_priority_queue.front();
    		}
    
    		bool empty()	const
    		{
    			return m_priority_queue.empty();
    		}
    
    	private:
    		Container m_priority_queue;
    		Compare c;
    	};
    }

    以上是“C++中priority_queue如何實現”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    c++
    AI

    磴口县| 咸阳市| 太仆寺旗| 眉山市| 南华县| 民和| 阳东县| 同德县| 金塔县| 宝鸡市| 岚皋县| 兴义市| 项城市| 扎赉特旗| 弥渡县| 昌乐县| 扎兰屯市| 江北区| 凌海市| 怀化市| 襄垣县| 佛山市| 紫云| 苏尼特左旗| 德州市| 巴中市| 辛集市| 盘山县| 凤台县| 奉贤区| 大安市| 武汉市| 新沂市| 富阳市| 耿马| 和政县| 富宁县| 五华县| 兴山县| 铜山县| 资中县|