早就该出手把“容器适配器“这么看似“高大上”的概念拉下“神坛“了---用vector来实现stack

       那一年, 我第一次接触到容器适配器这个概念, 那刻, 我正在喝水。 看完这个概念和解释, 我差点喷出水来。  书上也说的云里雾里的, 好像很高端似的, 其实一点也不高端, 就是个低级玩意儿而已。

       我们看看大名鼎鼎的C++ Primer怎么说:本质上, 适配器是一种机制, 能使某种事物的行为看起来像另外一种事物一样。 看到这个解释, 浑身就起了鸡皮疙瘩, 不要这么扯淡好不好?容器适配器不就是容器的一个变种么? 何必说的云里雾里呢?

       我们可以说, stack是一种容器适配器, 实际上就, 就是对一些容器(比如vector)进行裁剪, 变化或者阉割, 总之啦, 就是改变它, 形成容器的变种, 使之具有特定性质, 这就是容器适配器啊。 

       下面, 我们来简要地对容器vector进行阉割裁剪变化, 形成它的变种---MyStack,  也就是被鼓吹为容器适配器这么看似高大上的东东。 直接上码:

 

#include <iostream>
#include <vector>
using namespace std;

template<typename T>   // 类型抽象为T, 具体化后就是int啊, double啊, string啊之类的

class MyStack
{
private:
	vector<T> v;  // 类模板MyStack中有vector<T>, 用vector来适配出stack
	
public:
	T top() const
	{
		return v[v.size() - 1]; // 栈顶
	}

	void pop()
	{
		v.resize(v.size() - 1); // 出栈: 删除一个栈顶元素
	}

	void push(T t)
	{
		v.push_back(t);  // 入栈
	}

	bool empty()
	{
		if(v.begin() == v.end()) 
		{
			return true; // 空栈
		}

		return false;
	}
};


// 把10进制的n转为8进制的数
int main()
{
	MyStack<int> s;
	int n = 100;
	int r = 8; // r进制
	
	while(n)//范式
	{
		s.push(n % r);
		n /= r;
	}

	while(!s.empty())  //MyStack没有遍历器
	{
		cout << s.top();
		s.pop(); //s.pop()并不返回栈顶元素
	}

	cout << endl;

	return 0;
}

      结果是预期的144

 

 

      下面, 我们来用一下专家们阉割出来的更好的stack:

 

#include <iostream>
#include <stack>
using namespace std;

int main()
{
	stack<int> s;
	int n = 100;
	int r = 8; // r进制
	
	while(n)//范式
	{
		s.push(n % r);
		n /= r;
	}

	while(!s.empty())  //stack没有遍历器
	{
		cout << s.top();
		s.pop(); //s.pop()并不返回栈顶元素
	}

	cout << endl;

	return 0;
}

      结果也是144.  事实上, 通常情况下, stack是基于deque来实现的, 不过, 也可以基于其他容器来实现, 比如上面的vector.  爱咋搞咋搞。

 

 

 

      总结一下: 容器适配器实际上就是容器的变种, 别无其它。  

 

      原谅我, 我读书少, 不习惯也不喜欢高大上的概念, 尽管我知道这个世界上太多这样的东东。好吧, 不纠结了大笑

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值