STL序列式容器 heap

2021-07-11 01:10:06 字數 1642 閱讀 8468

stl- heap主要有以下幾種操作組成:

make_heap,建堆

sort_heap,堆排序

pop_heap,取出堆頂元素

push_heap,調整堆

heap並不歸屬於stl容器元件,它是個幕後英雄,扮演priority queue的助手。binary max heap適合作為priority queue的底層機制。

而這個實現機制中的max-heap實際上是以乙個vector表現的完全二叉樹(complete binary tree)。

二叉堆(binary heap)就是i一種完全二叉樹。也即是。整棵二叉樹除了最底層的葉節點以外,都是填滿的,而最低層的葉子結點必須是從左到右不留空隙。

至於max-heap和min-heap,前者的任何乙個父親結點都必須大於等於他的任意子結點,而後者相反。

上面表示的是一顆完全二叉樹。

下面我們利用陣列來隱式表達這棵數:

第0號元素保留,從arry[1]開始儲存a,這時候我們可以輕易的看到:

位於位置i的某個結點arry[i],他的左子結點必然在arry[2*i]中,右子結點必然位於arry[2*i+1],其父親結點必然位於arry[i/2]處。

這種陣列表達的方式我們 稱為 隱式表達。

當然由於arry大小是靜態的,不能動態新增元素,我們可以使用vector來實現。

heap演算法:

建立堆make_heap(_first, _last, _comp)

預設是建立最大堆的。對int型別,可以在第三個引數傳入greater()得到最小堆。

在堆中新增資料

push_heap (_first, _last)

要先在容器中加入資料push_back(),再呼叫push_heap ()

在堆中刪除資料

pop_heap(_first, _last)

要先呼叫pop_heap()再在容器中刪除資料

堆排序sort_heap(_first, _last)

排序之後就不再是乙個合法的heap了

下面我們來看測試例項吧:

priority_queue是乙個擁有權值觀念的queue,它允許加入新元素、移除舊元素、審視元素值等功能。由於這是乙個queue,所以只允許在底端加入元素,並從頂端取出元素,除此之外別無其它訪問元素的途徑。與queue不同,priority_queue預設情況下是以vector為底層容器,並加上heap處理規則

,因此,stl priority_queue往往不被歸類為container(容器),而被歸類為container adapter。

STL 序列式容器細節

stl 序列式容器細節 一 概論 1 序列式容器 array build in c 內建 vector heap內含乙個vector priority queue內含乙個heap list slist deque stack內含乙個deque queue內含乙個deque 2 關聯式容器 rb tr...

STL序列式容器概述

stl容器分為序列式和關聯式兩種,序列式容器,其中的元素都可序,但未必有序 heap內含乙個vector,priority queue內含乙個heap,stack和queue都內含乙個deque 1.以vector為底層實現 1.1 vectorvector詳情 vector維護的是乙個連續線性空間...

序列容器之 heap

heap並不歸屬於stl容器元件,它是個幕後英雄,扮演priority queue 4.8節 的助手。顧名思義,priority queue允許使用者以任何次序將任何元素推入容器內,但取出時一定是從優先權最高 也就是數值最高 的元素開始取。binary max heap正是具有這樣的特性,適合作為p...