關於STL中的優先佇列

2021-06-27 05:54:24 字數 3112 閱讀 6552

之前在c++ primer這本書上沒有看到關於優先佇列的東西,最近在看a*演算法中看到

總結一下

priority_queue的用法

priority_queue呼叫 stl裡面的 make_heap(), pop_heap(), push_heap() 演算法實現,也算是堆的另外一種形式。先寫乙個用 stl 裡面堆演算法實現的與真正的stl裡面的 priority_queue用法相似的priority_queue, 以加深對 priority_queue 的理解

#include

#include

#include

usingnamespacestd;

classpriority_queue

voidpop()

inttop()

intsize()

boolempty()

};

intmain()

return0;

}

stl裡面的 priority_queue 寫法與此相似,只是增加了模板及相關的迭代器什麼的。 

priority_queue 對於基本型別的使用方法相對簡單。他的模板宣告帶有三個引數:

priority_queue

其中type 為資料型別, container 為儲存資料的容器,functional 為元素比較方式。

container 必須是用陣列實現的容器,比如 vector, deque 但不能用 list.

stl裡面預設用的是 vector. 比較方式預設用 operator< , 所以如果你把後面倆個

引數預設的話,

優先佇列就是大頂堆,隊頭元素最大。

#include

#include

usingnamespacestd;

intmain()

getchar();

return0;

}

如果要用到小頂堆,則一般要把模板的三個引數都帶進去。

stl裡面定義了乙個仿函式 greater<>,對於基本型別可以用這個仿函式宣告小頂堆

#include

#include

usingnamespacestd;

intmain()

getchar();

return0;

}

對於自定義型別,則必須自己過載 operator< 或者自己寫仿函式

#include

#include

usingnamespacestd;

structnode

};

booloperator<( node a, node b )

intmain()

getchar();

return0;

}

自定義型別過載 operator< 後,宣告物件時就可以只帶乙個模板引數。

但此時不能像基本型別這樣宣告

priority_queue, greater>;

原因是 greater沒有定義,如果想用這種方法定義

則可以按如下方式:

#include

#include

usingnamespacestd;

structnode

};

structcmp

};

intmain()

getchar();

return0;

}

STL中優先佇列的使用

佇列的特點是先進先出。通常都把佇列比喻成排隊買東西,大家都很守秩序,先排隊的人就先買東西。但是優先佇列有所不同,它不遵循先進先出的規則,而是根據佇列中元素的優先權,優先權最大的先被取出。通常把優先佇列比喻成現實生活中的列印。乙個列印店裡有很多印表機,每台機器的效能不一樣,有的印表機列印很快,有的印表...

STL中優先佇列的使用

佇列的特點是先進先出。通常都把佇列比喻成排隊買東西,大家都很守秩序,先排隊的人就先買東西。但是優先佇列有所不同,它不遵循先進先出的規則,而是根據佇列中元素的優先權,優先權最大的先被取出。通常把優先佇列比喻成現實生活中的列印。乙個列印店裡有很多印表機,每台機器的效能不一樣,有的印表機列印很快,有的印表...

STL 優先佇列

優先佇列 在優先佇列中,優先順序高的元素先出佇列。標準庫預設使用元素型別的 操作符來確定它們之間的優先順序關係。優先佇列的第一種用法,也是最常用的用法 priority queue qi 通過 操作符可知在整數中元素大的優先順序高。故示例1 中輸出結果為 9 6 5 3 2 第二種方法 在示例1 中...