有序队列(sorted_queue)的C++实现

有序队列sorted_queue实现
本文介绍了一种名为sorted_queue的数据结构实现,该结构基于双端队列(deque)并支持元素的有序插入与删除。文章提供了完整的C++代码实现,并通过一个测试程序展示了其基本功能。

       有序队列(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.youkuaiyun.com/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.youkuaiyun.com/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
请按任意键继续. . .

 


参考资料

《STL源码剖析》

http://msdn.microsoft.com/en-us/library/ms132319.aspx







 

转载于:https://www.cnblogs.com/bbsno1/p/3265349.html

下面将展示一段综合运用了多种STL容器 (`vector`, `stack`, `queue`, `priority_queue`, `list`, `set`, `map`)C++ 示例程序。此代码演示了一个简单的任务调度系统,其中涉及到了排序 (`sort`) 和排列生成 (`next_permutation`)。 ```cpp #include <iostream> #include <vector> #include <stack> #include <queue> #include <list> #include <set> #include <map> #include <algorithm> // 包含 sort 和 next_permutation using namespace std; int main(){ // Vector 演示 vector<int> nums = {4, 2, 7}; cout << "原始数组: "; for(int n : nums){ cout << n << ' '; } cout << endl; // 对矢量进行升序排序 sort(nums.begin(), nums.end()); cout << "排序后的数组: "; for(int n : nums){ cout << n << ' '; } cout << endl; // Stack 演示 stack<int> mystack; for(auto &n : nums){ mystack.push(n); } while (!mystack.empty()){ int top_element = mystack.top(); cout << "Stack pop: " << top_element << endl; mystack.pop(); } // Queue 演示 queue<string> myqueue; myqueue.push("First"); myqueue.push("Second"); while(!myqueue.empty()){ string front_item = myqueue.front(); cout << "Queue pop: " << front_item << endl; myqueue.pop(); } // Priority Queue 演示 - 默认最大堆 priority_queue<int> pq_maxheap{nums.begin(), nums.end()}; cout << "\nPQ max heap elements:" ; while (!pq_maxheap.empty()) { cout << ' ' << pq_maxheap.top(); pq_maxheap.pop(); } // List 演示 list<int> lst({10, 9}); lst.sort(); cout << "\nSorted List contents:"; for (auto it=lst.cbegin(); it!=lst.cend(); ++it) cout << " ->" << *it; // Set 演示 set<int> uniqueNums(lst.begin(), lst.end()); if(uniqueNums.find(9)!=uniqueNums.end()) cout<<"\nNumber 9 found in the SET\n"; // Map 演示 map<char,int> counts {{'A',3},{'B',6}}; auto search_result = counts.find('A'); if(search_result !=counts.end()) cout<<"Map has key A with value:"<<search_result->second<<endl; // Next Permutation Demo using sorted vector do{ cout<<"\nNext permutation :"; for(const auto& i: nums)cout<<i; }while(next_permutation(nums.begin(), nums.end())); } ``` 请注意这个例子是为了教学目的而设计的,并不是最优实践的应用场景,而是为了说明每种容器的功能特性以及它们之间可能存在的交互方式。实际编程时应根据具体需求选用适当的数据结构和算法来提高性能效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值