那一年, 我第一次接触到容器适配器这个概念, 那刻, 我正在喝水。 看完这个概念和解释, 我差点喷出水来。 书上也说的云里雾里的, 好像很高端似的, 其实一点也不高端, 就是个低级玩意儿而已。
我们看看大名鼎鼎的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. 爱咋搞咋搞。
总结一下: 容器适配器实际上就是容器的变种, 别无其它。
原谅我, 我读书少, 不习惯也不喜欢高大上的概念, 尽管我知道这个世界上太多这样的东东。好吧, 不纠结了