有序隊列(sorted_queue)其實稱作有序表(sorted_list)更好,基於各種考慮,我將 sorted_queue 的底層容器設為 deque,看起來好像折中了 vector 和 list。
sorted_queue 的插入保證有序,故有移動元素的開銷,同樣刪除操作也會移動元素。但是,sorted_queue 支持隨機訪問,提供隨機迭代器,對有序區間的算法都可用在上面。sorted_queue 的定義還可改進,比如可以增加帶參的構造函數,swap 成員方法等。
sorted_queue 的定義及實現如下:
/******************************************************************** created: 2013/08/16 created: 16:8:2013 23:56 file base: sorted_queue file ext: h author: Justme0 (http://blog.csdn.net/Justme0) purpose: sorted_queue 的定義與實現 *********************************************************************/ #ifndef SORTED_QUEUE_H #define SORTED_QUEUE_H #include <deque> #include <algorithm> template <class T> class sorted_queue { public: typedef typename std::deque<t>::value_type value_type; typedef typename std::deque<t>::size_type size_type; typedef typename std::deque<t>::reference reference; typedef typename std::deque<t>::const_reference const_reference; typedef typename std::deque<t>::iterator iterator; typedef typename std::deque<t>::const_iterator const_iterator; protected: std::deque<T> c; // 底層容器 public: iterator begin() { return c.begin(); } const_iterator begin() const { return c.begin(); } iterator end() { return c.end(); } const_iterator end() const { return c.end(); } /* ** 直接存取 */ reference operator[](size_type n) { return c[n]; } const_reference operator[](size_type n) const { return c[n]; } 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(); } /* ** 插入元素 */ void push(const value_type & x) { c.insert(lower_bound(c.begin(), c.end(), x), x); } void pop_front() { c.pop_front(); } void pop_back() { c.pop_back(); } iterator erase(const_iterator position) { return c.erase(position); } iterator erase(const_iterator first, const_iterator last) { return c.erase(first, last); } /* ** 刪除所有值為 x 的元素 */ void remove(const value_type & x) { /* ** 下面這條語句中應該是不得不用 auto,因為不知道返回的是 iterator 還是 const_iterator。 ** 用 equal_range 效率較高。 */ auto interval = equal_range(this->begin(), this->end(), x); this->erase(interval.first, interval.second); } void clear() { c.clear(); } }; #endif
/******************************************************************** created: 2013/08/16 created: 16:8:2013 23:42 file base: test file ext: cpp author: Justme0 (http://blog.csdn.net/Justme0) purpose: sorted_queue 的測試程序 *********************************************************************/ #include <iostream> #include "sorted_queue.h" using namespace std; template <class T> void output(const sorted_queue<T> &sq) { for (auto ite = sq.begin(); ite != sq.end(); ++ite) { cout << *ite << " "; } cout << endl; } int main(int argc, char **argv) { sorted_queue<int> sq; sq.push(1); sq.push(-1); sq.push(0); sq.push(0); output(sq); cout << "[3]=" << sq[3] << endl; cout << "front=" << sq.front() << endl; cout << "back=" << sq.back() << endl; cout << (sq.empty() ? "empty" : "not empty") << endl; cout << endl; cout << "erase 0" << endl; sq.remove(0); output(sq); cout << endl; cout << "clear" << endl; sq.clear(); cout << (sq.empty() ? "empty" : "not empty") << endl; return 0; }
-1 0 0 1 [3]=1 front=-1 back=1 not empty erase 0 -1 1 clear empty 請按任意鍵繼續. . . -1 0 0 1 [3]=1 front=-1 back=1 not empty erase 0 -1 1 clear empty 請按任意鍵繼續. . .