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);
}
相关推荐
Logic1016 小时前
C语言/数据结构位运算题解:异或XOR找出星球探险中的“独特能量石“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
茉莉玫瑰花茶6 小时前
GO [ 类型 ]
开发语言·数据库·golang
梅雅达编程笔记6 小时前
02_BeautifulSoup网页数据提取
开发语言·爬虫·python·beautifulsoup·数据采集
Escalating_xu6 小时前
【C 语言】深入理解指针(3):字符指针、数组指针、二维数组传参、函数指针与转移表
java·c语言·开发语言
垆边人似月.6 小时前
华为机考题:最小代价爬楼梯
c语言·c++
可涵不会debug6 小时前
C++ std::bind 实战教程:线程池、回调场景全覆盖
linux·开发语言·c++
不正经的码狗6 小时前
Java 开发环境搭建与 Eclipse 使用速通教程
java·开发语言·eclipse
yi0116 小时前
DAY17: LeetCode 139|单词拆分:从“把单词删掉”到用 DP 记录合法切口
人工智能·笔记·python·算法·leetcode·动态规划
阿钱真强道6 小时前
24 嵌入式操作系统 | 项目启动与环境准备(PyQt5 / Flask 两个“最小可跑“)
开发语言·qt·flask·架构设计·协议契约
霸道流氓气质6 小时前
AI模型幻觉检测与抑制完全指南:从规则引擎到RAG对比的Java生产级实战
java·开发语言·人工智能