stl原始碼分析之priority queue

2021-12-29 22:40:36 字數 2121 閱讀 3680

前面兩篇介紹了gcc4.8的vector和list的原始碼實現,這是stl最常用了兩種序列式容器。除了容器之外,stl還提供了一種借助容器實現特殊操作的元件,謂之介面卡,比如stack,queue,priority queue等,本文就介紹gcc4.8的priority queue的原始碼實現。

顧名思義,priority queue是帶有優先順序的佇列,所以元素必須提供操作符,與vector和list不同,priority queue允許加入元素,但是取出時只能取出優先順序最高的元素。

一、 priority queue定義

priority queue沒有基類

複製**

template,

typename _compare  = less >

class priority_queue  

explicit

priority_queue(const _compare& __x = _compare(),

_sequence&& __s = _sequence())

: c(std::move(__s)), comp(__x)

template

priority_queue(_inputiterator __first, _inputiterator __last,

const _compare& __x,

const _sequence& __s)

: c(__s), comp(__x)

template

priority_queue(_inputiterator __first, _inputiterator __last,

const _compare& __x = _compare(),

_sequence&& __s = _sequence())

: c(std::move(__s)), comp(__x)

複製**

將元素全部插入priority queue後,使用 make_heap將其建成最大堆,

複製**

template

void make_heap(_randomaccessiterator __first, _randomaccessiterator __last)

}複製**

__adjust_heap是乙個下溯過程,從最後乙個非葉子節點往前乙個個執行下溯過程,使得以其為根節點的子樹是乙個最大堆。

複製**

template

typename _tp, typename _compare>

void  __adjust_heap(_randomaccessiterator __first, _distance __holeindex,

_distance __len, _tp __value, _compare __comp)

if ((__len & 1) == 0 && __secondchild == (__len - 2) / 2)

std::__push_heap(__first, __holeindex, __topindex, 

_glibcxx_move(__value), __comp);      

}複製**

三、 priority queue的元素操作

priority queue只有push和pop兩個主要操作,push增加新的元素,

void push(const value_type& __x)

先放到最後乙個位置,再使用 push_heap執行乙個上溯操作,將插入元素移動到合適位置,保證整個queue仍然是個最大堆。

複製**

template

void

__push_heap(_randomaccessiterator __first,

_distance __holeindex, _distance __topindex, _tp __value)

*(__first + __holeindex) = _glibcxx_move(__value);

}複製**

pop操作移除堆頂元素,

void pop()  

由於使用的是vector,如果移除第乙個元素再make_heap的話代價會很大。這裡先將第乙個元素和最後乙個元素交換,刪除最後乙個元素,再從第乙個元素做一次下溯過程,就建成了新的最大堆。

STL原始碼分析之Vector

地球人都知道vector的查詢效率很高,插入和刪除的效率低下,容器會隨著元素的不斷增加自動增長,最近在看了stl原始碼之後,發現確實是這樣,下面是vector一些關鍵的函式.從這些函式可以看出插入和刪除的過程,以及容器自動增長的方式.兩個通過下標獲取元素的函式.reference operator ...

STL之pair原始碼分析

直接進入主題,請看pair的原始碼 namespace std 預設建構函式,用型別的預設建構函式初始化兩個資料成員 pair const t1 a,const t2 b first a second b 建構函式,用a初始化first,用b初始化second template 模板函式,拷貝建構函...

STL原始碼分析之vector

vector是序列容器的一種,分配的是一段連續的空間,所以它支援下標訪問,同時它另一特點是可以自行擴充空間,每次是以原大小兩倍來擴充,是另外配置的一塊空間,將原內容拷貝過去,所以當對vector的空間進行重新配置時,指向原vector的迭代器就失效了。下面分析它具體是怎麼實現的和熟悉下vector內...