之前在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
using
namespace
std;
class
priority_queue
void
pop()
int
top()
int
size()
bool
empty()
};
int
main()
return
0;
}
stl裡面的 priority_queue 寫法與此相似,只是增加了模板及相關的迭代器什麼的。
priority_queue 對於基本型別的使用方法相對簡單。他的模板宣告帶有三個引數:
priority_queue
其中type 為資料型別, container 為儲存資料的容器,functional 為元素比較方式。
container 必須是用陣列實現的容器,比如 vector, deque 但不能用 list.
stl裡面預設用的是 vector. 比較方式預設用 operator< , 所以如果你把後面倆個
引數預設的話,
優先佇列就是大頂堆,隊頭元素最大。
#include
#include
using
namespace
std;
int
main()
getchar
();
return
0;
}
如果要用到小頂堆,則一般要把模板的三個引數都帶進去。
stl裡面定義了乙個仿函式 greater<>,對於基本型別可以用這個仿函式宣告小頂堆
#include
#include
using
namespace
std;
int
main()
getchar
();
return
0;
}
對於自定義型別,則必須自己過載 operator< 或者自己寫仿函式
#include
#include
using
namespace
std;
struct
node
};
bool
operator<( node a, node b )
int
main()
getchar
();
return
0;
}
自定義型別過載 operator< 後,宣告物件時就可以只帶乙個模板引數。
但此時不能像基本型別這樣宣告
priority_queue, greater>;
原因是 greater沒有定義,如果想用這種方法定義
則可以按如下方式:
#include
#include
using
namespace
std;
struct
node
};
struct
cmp
};
int
main()
getchar
();
return
0;
}
STL中優先佇列的使用
佇列的特點是先進先出。通常都把佇列比喻成排隊買東西,大家都很守秩序,先排隊的人就先買東西。但是優先佇列有所不同,它不遵循先進先出的規則,而是根據佇列中元素的優先權,優先權最大的先被取出。通常把優先佇列比喻成現實生活中的列印。乙個列印店裡有很多印表機,每台機器的效能不一樣,有的印表機列印很快,有的印表...
STL中優先佇列的使用
佇列的特點是先進先出。通常都把佇列比喻成排隊買東西,大家都很守秩序,先排隊的人就先買東西。但是優先佇列有所不同,它不遵循先進先出的規則,而是根據佇列中元素的優先權,優先權最大的先被取出。通常把優先佇列比喻成現實生活中的列印。乙個列印店裡有很多印表機,每台機器的效能不一樣,有的印表機列印很快,有的印表...
STL 優先佇列
優先佇列 在優先佇列中,優先順序高的元素先出佇列。標準庫預設使用元素型別的 操作符來確定它們之間的優先順序關係。優先佇列的第一種用法,也是最常用的用法 priority queue qi 通過 操作符可知在整數中元素大的優先順序高。故示例1 中輸出結果為 9 6 5 3 2 第二種方法 在示例1 中...