STL源碼剖析 priority_queue

  • priority_queue是一個擁有權重概念的queue,允許底部加入新的元素,頭部刪除舊的元素,以及審視元素數值的操作
  • priority_queue帶有權重的概念,即元素按照權重進行排列,而不是按照插入隊列的順序進行排序。要求權值高者在前
  • 缺省情況下,priority_queue使用max_heap完成,而max_heap物理層面是基于vector邏輯層面表現像complate binary tree;max_tree用于實現priority_queue的按照權值高低自動遞增排序的特性

priority_queue定義完整列表

  • priority_queue底層使用vector,在加上堆的處理規則
  • priority_queue不被歸納為容器 而是容器適配器
#include <iostream>
#include <vector>#ifdef __STL_USE_EXCEPTIONS
#define __STL_TRY   try
#define __STL_UNWIND(action)   catch(...) { action; throw; }
#else
#define __STL_TRY
#define __STL_UNWIND(action)
#endiftemplate <class T,class Sequence = std::vector<T>,class Compare = std::less<typename Sequence::value_type>>
class priority_queue{
public:typedef typename Sequence::valuetype value_type;typedef typename Sequence::size_type size_type;typedef typename Sequence::reference reference;typedef typename Sequence::const_reference const_reference;
protected:Sequence c; //底層容器Compare comp; //元素大小的比較標準
public:priority_queue() : c (){}explicit priority_queue(const Compare& x) : c() ,comp(x){}//以下使用的make_heap()、push_heap()、pop_heap()都是泛型算法//注意 任意一個構造函數都立刻在底層容器內產生一個implicit representation heap//指代比較器template<class InputIterator>priority_queue(InputIterator first, InputIterator last,const Compare& x):c(first,last),comp(x){std::make_heap(c.begin(),c.end(),comp);}//沒有指代比較器template<class InputIterator>priority_queue(InputIterator first, InputIterator last):c(first,last){std::make_heap(c.begin(),c.end(),comp);}bool empty()const{return c.empty();}size_type size() const{return c.size();}const_reference top()const{return c.front();}void push(const value_type& x){__STL_TRY{//push_heap 是泛型算法,先利用底層的push_back()將新的元素推入末端,再重新排列heapc.push_back(x);//push_heap 是泛型算法std::push_heap(c.begin(),c.end(),comp);}__STL_UNWIND(c.clear());}void pop(){__STL_TRY{//pop_heap是泛型算法,從heap中取出一個元素,并不是整整將這個元素彈出,而是重排heap//需要使用底層vector的pop_back()取得被彈出的元素std::pop_heap(c.begin(),c.end(),comp);c.pop_back();}__STL_UNWIND(c.clear());}};

priority_queue沒有迭代器

  • priority_queue的所有元素進出是有規則限制的,只有queue的頂端元素(權值最高者)才可以被外界使用
  • priority_queue不提供遍歷的功能,因此無迭代器

測試用例

#include <iostream>
#include <vector>#ifdef __STL_USE_EXCEPTIONS
#define __STL_TRY   try
#define __STL_UNWIND(action)   catch(...) { action; throw; }
#else
#define __STL_TRY
#define __STL_UNWIND(action)
#endiftemplate <class T,class Sequence = std::vector<T>,class Compare = std::less<typename Sequence::value_type>>
class priority_queue{
public:typedef typename Sequence::value_type value_type;typedef typename Sequence::size_type size_type;typedef typename Sequence::reference reference;typedef typename Sequence::const_reference const_reference;
protected:Sequence c; //底層容器Compare comp; //元素大小的比較標準
public:priority_queue() : c (){}explicit priority_queue(const Compare& x) : c() ,comp(x){}//以下使用的make_heap()、push_heap()、pop_heap()都是泛型算法//注意 任意一個構造函數都立刻在底層容器內產生一個implicit representation heap//指代比較器template<class InputIterator>priority_queue(InputIterator first, InputIterator last,const Compare& x):c(first,last),comp(x){std::make_heap(c.begin(),c.end(),comp);}//沒有指代比較器template<class InputIterator>priority_queue(InputIterator first, InputIterator last):c(first,last){std::make_heap(c.begin(),c.end(),comp);}bool empty()const{return c.empty();}size_type size() const{return c.size();}const_reference top()const{return c.front();}void push(const value_type& x){__STL_TRY{//push_heap 是泛型算法,先利用底層的push_back()將新的元素推入末端,再重新排列heapc.push_back(x);//push_heap 是泛型算法std::push_heap(c.begin(),c.end(),comp);}__STL_UNWIND(c.clear());}void pop(){__STL_TRY{//pop_heap是泛型算法,從heap中取出一個元素,并不是整整將這個元素彈出,而是重排heap//需要使用底層vector的pop_back()取得被彈出的元素std::pop_heap(c.begin(),c.end(),comp);c.pop_back();}__STL_UNWIND(c.clear());}
};int main(){int ia[9] = {0,1,2,3,4,8,9,3,5};priority_queue<int>iqp(ia,ia+9);std::cout << iqp.size() << std::endl; //9for (int i = 0; i < iqp.size(); ++i) {std::cout << iqp.top() << ' '; //9 9 9 9 9 9 9 9 9}std::cout << std::endl;while(!iqp.empty()){std::cout << iqp.top() << ' '; //9 8 5 4 3 3 2 1 0iqp.pop();}std::cout << std::endl;
}

參考鏈接

  • __STL_TRY和__STL_UNWIND這兩個宏的意思 - Superpig0501 - 博客園

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446256.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446256.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446256.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python數字1 3怎么表示_Python入門篇之數字

數字類型 數字提供了標量貯存和直接訪問。它是不可更改類型&#xff0c;也就是說變更數字的值會生成新的對象。當然&#xff0c;這個過程無論對程序員還是對用戶都是透明的&#xff0c;并不會影響軟件的開發方式。 Python 支持多種數字類型&#xff1a;整型、長整型、布爾型、雙…

java 打印100以內的質數

題目 質數&#xff1a;只能被1和它本身所整除的數。即&#xff1a;從2開始一直到這個數-1&#xff0c;都不能被這個數整除&#xff1b;最小的質數是2 知識點 1.System.currentTimeMillis():計算當前時間距離1970-1-1的毫秒數&#xff0c;返回long 2.Math.sqrt&#xff1a;開…

STL源碼剖析 slist單向鏈表概述

概述 SGI STL的list是一個雙向鏈表&#xff0c;單向鏈表是slist&#xff0c;其不在標準規格之內單向和雙向鏈表的區別在于&#xff0c;單向鏈表的迭代器是單向的 Forward Iterator&#xff0c;雙向鏈表的迭代器屬于雙向的Bidirectional Iterator。因此很多功能都被受限但是單向…

output怎么用_用樹莓派實現室內溫度監控

樹莓派加上溫度傳感器實現室內溫度監控。可用于家庭&#xff0c;轎車&#xff0c;工業&#xff0c;農業 等許多方面。可做溫度預警&#xff0c;自動降溫等操作。各位小伙伴可自行腦補發揮。1.硬件準備a.樹莓派&#xff08;Raspberry Pi&#xff09;一個b.DS18B20溫度傳感器一個…

java 家庭收支賬戶

代碼1 package lesson.project.p1_familyAccount;import java.util.Scanner;public class FamilyAccount {public static int money 10000;public static String all "";public static void main(String[] args) {Scanner scanner new Scanner(System.in);while …

【Android 13】使用Android Studio調試系統應用之Settings移植(四):40+個依賴子模塊之ActionBarShadow

文章目錄 一、篇頭二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、子模塊AS移植3.1 AS創建目標3.2 創建ActionBarShadow(1)使用VS Code打開org_settings/SettingsLib目錄(2)ActionBarShadow的Manifest.xml(3)ActionBarShadow的An…

STL源碼剖析 關聯式容器

STL關聯式容器以set(集合) 和 map(映射表)兩大類&#xff0c;以及對應的衍生體構成,比如mulyiset(多鍵集合) multimap(多鍵映射表) ,容器的底層均基于紅黑樹RB-Tree也是一個獨立的容器&#xff0c;但是不對外開放此外還提供了標準之外的關聯式容器 hash table散列表&#xff0c…

python求小于n的所有素數_用python求出2000000內所有素數的和?不知怎么寫?

展開全部 import itertools import time N 2000000 L range(N) def findnxt(s): flag 0 for n in itertools.ifilter(None, L[s1:]): return n t0 time.time() n 2 X int(N ** .5) while n < X: for i, x in enumerate(L[::n][1:]): if i0: continue L[x] 0 n findn…

STL源碼剖析 關聯式容器 紅黑樹

概念 紅黑樹不僅僅是一個二叉樹&#xff0c;必須滿足如下條件1&#xff0c;每個節點不是紅色就是黑色 (深色底紋為黑色&#xff0c;淺色底紋為紅色)2&#xff0c;根節點是黑色的3&#xff0c;如果節點為紅&#xff0c;其子節點必須為黑色的4&#xff0c;任一節點至NULL(樹的尾…

java藍橋杯 試題-基礎練習-數列排序

試題-基礎練習-數列排序 題目 問題描述   給定一個長度為n的數列&#xff0c;將這個數列按從小到大的順序排列。1<n<200 輸入格式   第一行為一個整數n。   第二行包含n個整數&#xff0c;為待排序的數&#xff0c;每個整數的絕對值小于10000。 輸出格式   輸出…

python生成的詞云沒有圖案_還在為專欄封面發愁?我用Python寫了個詞云生成器!...

媽媽再也不用擔心我寫專欄找不到合適的封面了&#xff01;B站專欄的封面至少是我一直頭疼的問題&#xff0c;每次寫完文章卻找不到合適的圖片作為封面。 詞云是一個很不錯的選擇&#xff0c;既美觀&#xff0c;又提綱挈領。網上也有詞云生成的工具&#xff0c;但大多收費/只能試…

java 1000以內的完數

題目 代碼 package lesson.l6_review;public class PrefectNumber {public static void main(String[] args) {for (int i 1; i <1000 ; i) {int num0;for (int j 1; j <i-1 ; j) {if (i%j0){numj;}}if (inum){System.out.print(i"\t");}}} }

STL源碼剖析 set集合

set的特性是 所有的元素會按照鍵值自動排序set 的鍵值等同于實值set不允許涵蓋兩個相同的鍵值不可以通過迭代器修改set的元素數值&#xff0c;這會破壞元素的排列順序。因此set<T>::iterator 被定義為底層RB-tree的const_iterator,杜絕寫入。也就是set的iterators是一種c…

python turtle畫圣誕樹動圖_圣誕節!教你用Python畫棵圣誕樹

作者 | 糖甜甜甜&#xff0c;985高校經管研二&#xff0c;擅長用 Python、R、tableau 等工具結合統計學和機器學習模型做數據分析。 如何用Python畫一個圣誕樹呢&#xff1f; 最簡單&#xff1a; 1height 5 2 3stars 1 4for i inrange(height): 5print(( * (height - i)) (** …

java藍橋杯 試題-基礎練習-十六進制轉八進制

試題-基礎練習-十六進制轉八進制 題目 試題 基礎練習 十六進制轉八進制 資源限制 時間限制&#xff1a;1.0s 內存限制&#xff1a;512.0MB 問題描述   給定n個十六進制正整數&#xff0c;輸出它們對應的八進制數。 輸入格式   輸入的第一行為一個正整數n &#xff08;1…

STL源碼剖析 map

所有元素會根據元素的鍵值自動被排序 元素的類型是pair&#xff0c;同時擁有鍵值和實值&#xff1b;map不允許兩個元素出現相同的鍵值pair 代碼 template <class T1,class T2> struct pair{typedef T1 first_type;typedef T2 second_type;T1 first; //publicT2 secon…

java api接口怎么寫_Java 如何設計 API 接口,實現統一格式返回?

來源&#xff1a;老顧聊技術前言接口交互返回格式控制層Controller美觀美化優雅優化實現方案前言在移動互聯網&#xff0c;分布式、微服務盛行的今天&#xff0c;現在項目絕大部分都采用的微服務框架&#xff0c;前后端分離方式&#xff0c;(題外話&#xff1a;前后端的工作職責…

java 輸出學生成績和成績等級

題目 從鍵盤讀入學生成績&#xff0c;找出最高分&#xff0c;并輸出學生成績等級。?成績>最高分-10 等級為’A’?成績>最高分-20 等級為’B’?成績>最高分-30 等級為’C’?其余 等級為’D’提示&#xff1a;先讀入學生人數&#xff0c;根據人數創建int數組&#…

STL源碼剖析 multiset 和 multimap

multiset和set完全相同&#xff0c;唯一的差別在于允許鍵值的重復&#xff0c;因此底層操作使用的是紅黑樹的insert_equal() 而不是insert_unique()multimap和map完全相同&#xff0c;唯一的差別在于允許鍵值的重復&#xff0c;因此底層操作使用的是紅黑樹的insert_equal() 而不…

java 二維數組

聲明和初始化 靜態初始化 // 靜態初始化&#xff1a; // 一維數組int[] arr1_1 {1, 2, 4};System.out.println(Arrays.toString(arr1_1)); // 二維數組int[][] arr1_2 {{1, 2}, {4, 5}, {9, 10}};for (int[] i :arr1_2) {System.out.print(Arrays.toS…