簡介Policy-Based Data Structures ( __gnu_pbds )
前言: __gnu_pbds全名為GNU Policy-Based Data Structures,競賽中俗稱黑魔法,因為其內建了許多強大的工具,例如:可合併堆、伸展樹、紅黑樹、字典樹、hash table...,不過因為他放在一個很奇怪的標頭檔底下,且不是所有編譯器都支援(從名稱就知道那是GNU的東西),所以也沒那麼多人會使用他。 1. 使用方法 要使用其的資料結構時,請先引入ext/pb_ds/assoc_container.hpp,若要使用priority_queue時則還要多引入ext/pb_ds/priority_queue.hpp,而那些東東都包在__gnu_pbds這個namespace底下,所以如果懶的話,可以全部把他倒出來。 p.s不過如果std的也倒出來priority_queue會衝突到,此時建議還是要加個__gnu_pbds::在前面 #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/priority_queue.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; 2. priority_queue 可合併堆是我第一個知道的功能,那我們先看看他的type模板到底寫了甚麼吧 template< typename Value_Type, typename Cmp_Fn = std::less<Value_Type>, typename Tag = pairing_heap_tag, typename Allocator = std::allocator<char> > class priority_queue; 這裡最常會動到的大概就是Value_Type跟Cmp_Fn了吧 Value_type 顯然是你的資料型別 Cmp_Fn 則是一個物件,其必須包含一個bool operator(),他會用來比較你的兩個資料,以知道誰該在你呼叫top時出現 比較神奇的一個東東是Tag,預設為paring_heap_tag,也就是說他預設配對堆,不