[C++]stack,queue,deque


一、适配器和迭代器


迭代器模式 是STL中的迭代器在封装后不暴露内部细节,使得上层使用时达到一种统一的方法访问
适配器模式 是通过原内容封装转换出形式

stack 和 queue 通过容器适配转换出来的,不是原生实现的


二、stack


stack没有迭代器

namespace bsy
{
	template<class T , class Container> //stack类模拟实现
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_back();
		}

		size_t size()
		{
			return _con.size();
		}

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

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

	private:
		Container _con;
	};

	void test_stack1()
	{
		//stack底层可以是链表也可以是vector
		//stack<int, vector<int> > st;
		stack<int, list<int> > st;
		st.push(1); //stack没有push_back
		st.push(2);
		st.push(3);
		st.push(4);
		while (!st.empty())
		{
			cout << st.top() << " ";
			st.pop();
		}
		cout << endl;
	}
}


三、queue


queue没有迭代器

namespace 9TSe
{
	template<class T, class Container = deque<T>>  //vector无法实现,vector没有前插前删操作,效率太低,一般是list作为底层
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}

		void pop()
		{
			_con.pop_front();  
		}

		size_t size()
		{
			return _con.size();
		}

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

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

		T& back()
		{
			return _con.back();
		}
		
	private:
		Container _con;
	};
	
	void test_queue1()
	{
		queue<int, list<int> > que;
		que.push(1);
		que.push(2);
		que.push(3);
		que.push(4);
		while (!que.empty())
		{
			cout << que.front() << " ";
			que.pop();
		}
		cout << endl;
	}
}

四、deque


vector不支持前删前插,list不支持随机访问,但是有deque(双端队列)是其优点的集合
deque有迭代器

void test_deque1() //基本使用方法
{
	deque<int> d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	d.push_back(4);
	d.push_front(0);
	d.push_front(-1);
	d.pop_front();
	for (size_t i = 0; i < d.size(); ++i)
	{
		cout << d[i] << " ";
	}
	cout << endl;
	//deque既可以支持头插头删,也可以支持下标随机访问
}

//那为什么集大成者却没有完全替代上述两种容器呢?
//效率上还是不如vector 和 list

void test_deque2() //测试效率差距
{
	deque<int> d;
	vector<int> v;
	const int n = 1000000;
	int* a1 = new int[n];
	int* a2 = new int[n];

	srand(time(0));
	for (size_t i = 0; i < n; ++i)
	{
		int x = rand();
		d.push_back(x);
		v.push_back(x);
	}

	size_t begin1 = clock();
	sort(d.begin(), d.end());
	size_t end1 = clock();

	size_t begin2 = clock();
	sort(v.begin(), v.end());
	size_t end2 = clock();

	cout <<"deque : " << end1 - begin1 << endl; //250
	cout <<"vector : " << end2 - begin2 << endl; //50

	//约有五倍的效率差
	//随机访问的效率无法替代vector(sort底层用下标访问)
	//头尾插入删除的效率还可以,stack和queue没有使用到它的随机访问
}

deque的原理是一小段数组一小段数组组成的,形状可以理解为list< vector > 但不是,list不支持随机访问
由中控管理的指针数组,存储每一个小数组的地址,且该指针数组会增容,所以数据量大的话,效率就低了
迭代器由四个部分组成 cur(当前位置),first(当前小数组的头位),last(当前小数组的末尾),node(中控管理的指针数组的当前访问数组的指针)
总之,一般来说deque不行


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值