10.queue的模拟实现

一.适配器讲解

可维护性

设计模式

适配器模式 -- 封装转换

迭代器模式 -- 封装统一访问方式(数据结构访问都可以用)

C语言做这个过程只是太过麻烦,而不是不可以

下面是用C语言实现成员函数(C语言中,struct是没有成员函数的)

cpp 复制代码
void PushBack(int x)
{
	printf("void PushBack(int x)\n");
}

// C
struct Vector
{
	void(*push_back)(int);

	int* _a;
	int _size;
	int _capacity;
};

void Init(struct Vector* pv)
{
	pv->push_back = PushBack;
	//...
}

int main()
{
	Vector v;
	Init(&v);

	v.push_back(1);
	v.push_back(2);

	return 0;
}

二.queue的实现

cpp 复制代码
#pragma once
#include<vector>
#include<list>
#include<deque>

using namespace std;

namespace ltw
{
	// deque list
	// 不支持vector(vector没有直接支持头删(效率太低了))
	template<class T, class Container = deque<T>>
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_front();

			// 这样就可以支持vector了,但是效率就很低了
			//_con.erase(_con.begin());
		}

		const T& back()
		{
			return _con.back();
		}

		const T& front()
		{
			return _con.front();
		}

		bool empty()
		{
			return _con.empty();
		}

		size_t size()
		{
			_con.size();
		}
	private:
		Container _con;
	};
}

queue的实现,是不建议使用vector进行当作适配器的

测试代码:

cpp 复制代码
void test_queue()
{
	ltw::queue<int> q;
	//ltw::queue<int,list<int>> q;

	// 不支持
	//ltw::queue<int, vector<int>> q;

	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);

	while (!q.empty())
	{
		cout << q.front() << " ";
		q.pop();
	}
	cout << endl;
}

只能说是,任何容器(逻辑差不多的容器)都能通过特定的方式被当作适配器,但是效率不同

三.stack和queue的默认适配容器(deque)

1.deque的成员函数等

从功能上,我们都基本上都清楚了

2.vector,list和deque的优劣分析

deque就相当于是vector和list的结合体

deque的[]访问的效率不如vector,insert的效率不如list

3.测试代码(了解即可):

测试vector和deque排序(全是[]访问):

cpp 复制代码
void test_op1()
{
	srand(time(0));
	const int N = 1000000;

	deque<int> dq;
	vector<int> v;

	for (int i = 0; i < N; ++i)
	{
		auto e = rand() + i;
		v.push_back(e);
		dq.push_back(e);
	}

	int begin1 = clock();
	sort(v.begin(), v.end());
	int end1 = clock();

	int begin2 = clock();
	sort(dq.begin(), dq.end());
	int end2 = clock();

	printf("vector:%d\n", end1 - begin1);
	printf("deque:%d\n", end2 - begin2);
}

让vector进行排序,排完再拷贝回去:

cpp 复制代码
void test_op2()
{
	srand(time(0));
	const int N = 1000000;

	deque<int> dq1;
	deque<int> dq2;

	for (int i = 0; i < N; ++i)
	{
		auto e = rand() + i;
		dq1.push_back(e);
		dq2.push_back(e);
	}

	int begin1 = clock();
	sort(dq1.begin(), dq1.end());
	int end1 = clock();

	int begin2 = clock();
	// 拷贝到vector
	vector<int> v(dq2.begin(), dq2.end());
	sort(v.begin(), v.end());
	dq2.assign(v.begin(), v.end());
	int end2 = clock();

	printf("deque sort:%d\n", end1 - begin1);
	printf("deque copy vector sort, copy back deque:%d\n", end2 - begin2);
}
相关推荐
RainbowC03 小时前
GapBuffer高效标记管理算法
android·算法
宋恩淇要努力3 小时前
C++多态
c++
mit6.8243 小时前
10.17 枚举中间|图论
算法
哦你看看3 小时前
学习Python 03
开发语言·windows·python
shinelord明3 小时前
【大数据技术实战】Kafka 认证机制全解析
大数据·数据结构·分布式·架构·kafka
小龙报4 小时前
《彻底理解C语言指针全攻略(6)-- qsort、sizeof和strlen》
c语言·开发语言·职场和发展·创业创新·学习方法·业界资讯·visual studio
让我们一起加油好吗4 小时前
【基础算法】01BFS
数据结构·c++·算法·bfs·01bfs
孤狼灬笑4 小时前
机器学习十大经典算法解析与对比
人工智能·算法·机器学习
草莓工作室4 小时前
数据结构3:线性表2-顺序存储的线性表
数据结构·windows