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);
}
相关推荐
大飞记Python12 分钟前
【2026更新】Python基础学习指南(AI版)——04数据类型
开发语言·人工智能·python
生成论实验室21 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星34 分钟前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
Alice-YUE1 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
云泽8081 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
froginwe111 小时前
DOM 加载函数
开发语言
科研前沿1 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨1 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
Hello eveybody2 小时前
介绍一下背包DP(Python)
开发语言·python·动态规划·dp·背包dp
AI进化营-智能译站2 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人