標籤:style blog http color os io
本文為senlie原創,轉載請保留此地址:http://blog.csdn.net/zhengsenlie
queue
----------------------------------------------------------------------
stack 是一種配接器(adapter),以某種容器作為底部結構,改變其介面,使之符合"先進先出"的特性。
SGI STL 預設以 deque 為 stack 底部結構
沒有遍曆行為,沒有遍曆器
樣本:
#include <queue>#include <list>#include <iostream>#include <algorithm>using namespace std;int main(){queue<int, list<int> >iqueue;iqueue.push(1);iqueue.push(2);cout << iqueue.size() << endl << iqueue.front() << endl;}
源碼:
#ifndef __SGI_STL_INTERNAL_QUEUE_H#define __SGI_STL_INTERNAL_QUEUE_H__STL_BEGIN_NAMESPACE#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class T, class Sequence = deque<T> >//預設以 deque 為底層容器#elsetemplate <class T, class Sequence>#endifclass queue { friend bool operator== __STL_NULL_TMPL_ARGS (const queue& x, const queue& y); friend bool operator< __STL_NULL_TMPL_ARGS (const queue& x, const queue& y);public: typedef typename Sequence::value_type value_type; typedef typename Sequence::size_type size_type; typedef typename Sequence::reference reference; typedef typename Sequence::const_reference const_reference;protected: Sequence c;//底層容器public: //以下完全利用 Sequence c 的操作完成 queue 的操作 bool empty() const { return c.empty(); } size_type size() const { return c.size(); } reference front() { return c.front(); } const_reference front() const { return c.front(); } reference back() { return c.back(); } const_reference back() const { return c.back(); } //修改介面使符合 queue "前進先出"的條件 void push(const value_type& x) { c.push_back(x); } void pop() { c.pop_front(); }};template <class T, class Sequence>bool operator==(const queue<T, Sequence>& x, const queue<T, Sequence>& y) { return x.c == y.c;}template <class T, class Sequence>bool operator<(const queue<T, Sequence>& x, const queue<T, Sequence>& y) { return x.c < y.c;}
priority_queue
-------------------------------------------------------------------
priority_queue 是一個 queue ,所以只允許在底端加入元素,並從頂端取出元素,
priority_queue 帶有權值觀念,其內的元素並非依照被推入的次序排列,而是自動依照元素的權值排列。
priority_queue 以底部容器為依據,再加上 heap 處理規則,預設是以 vector 為底層容器
樣本:
int main(){int ia[] = {0,1,2,3,4,8,9,3,5};priority_queue<int> ipq(ia, ia + 9);while(!ipq.empty()){cout << ipq.top() << ' ';ipq.pop();}cout << endl;}源碼:
#ifndef __STL_LIMITED_DEFAULT_TEMPLATEStemplate <class T, class Sequence = vector<T>, //底部預設採用 vector 容器 class Compare = less<typename Sequence::value_type> > //預設權值大的排在前面#elsetemplate <class T, class Sequence, class Compare>#endifclass priority_queue {public: typedef typename Sequence::value_type value_type; typedef typename Sequence::size_type size_type; typedef typename Sequence::reference reference; typedef typename Sequence::const_reference const_reference;protected: Sequence c; //底層容器 Compare comp; //元素大小比較標準public: priority_queue() : c() {} explicit priority_queue(const Compare& x) : c(), comp(x) {}#ifdef __STL_MEMBER_TEMPLATES template <class InputIterator> priority_queue(InputIterator first, InputIterator last, const Compare& x) : c(first, last), comp(x) { make_heap(c.begin(), c.end(), comp); } template <class InputIterator> priority_queue(InputIterator first, InputIterator last) : c(first, last) { make_heap(c.begin(), c.end(), comp); }#else /* __STL_MEMBER_TEMPLATES */ priority_queue(const value_type* first, const value_type* last, const Compare& x) : c(first, last), comp(x) { make_heap(c.begin(), c.end(), comp); } priority_queue(const value_type* first, const value_type* last) : c(first, last) { make_heap(c.begin(), c.end(), comp); }#endif /* __STL_MEMBER_TEMPLATES */ bool empty() const { return c.empty(); } size_type size() const { return c.size(); } const_reference top() const { return c.front(); } void push(const value_type& x) { __STL_TRY { //無利用底層容器的 push_back() 將新元素推入末端,再重排 heap() c.push_back(x); push_heap(c.begin(), c.end(), comp); } __STL_UNWIND(c.clear()); } void pop() { __STL_TRY { //將權值最大或最小放在尾端 pop_heap(c.begin(), c.end(), comp); //將用底層容器的 pop_back() 彈出 c.pop_back(); } __STL_UNWIND(c.clear()); }};// no equality is provided__STL_END_NAMESPACE#endif /* __SGI_STL_INTERNAL_QUEUE_H */// Local Variables:// mode:C++// End: