目录
容器适配器
容器适配器是stl的六大组件之一。
容器适配器还是一个数据结构,但他并不是原生实现的,而是拿容器适配出来的。本文将要讲到stack和queue都是通过容器(deque)适配转换出来的,不是原生实现的。
容器适配器都不支持迭代器遍历,应为他们通常都包含一些特殊性质,例如stack是性质是后入先出( Last In First Out ) ,如果支持了迭代器就可以随机访问
stack的模拟实现
stackl一种容器适配器,专门设计用于在后进先出上(Last In First Out)中运行,其中元素仅从容器的一端插入和提取。
我们先看库里面的stack,他有两个模板参数,第二个参数是一个容器,库里的写成了一个缺省参数
当我们传容器时,默认就是容器deque.
template<class T,class container>
class stack
{
public:
private:
container _con;
};
注意:我们模拟实现的是没有缺省参数的,当我们使用自己写的stack是要传两个参数。
stack的成员函数:
template<class T ,class container>
{
public:
void push(const T& x)
{
_con.push_back();
}
void pop()
{
_con.pop_back();
}
size_t size()
{
return _con.size();
}
bool empty()
{
return _con.emnpty
}
T& top()
{
return _con.back();
}
private:
containar _con;
}
我们看到这里的函数实现出来是比较简单地,就拿传入的容器时llist来举例,因为容器list里面已经有写好的函数,这里直接调用就可以实现想要完成的任务。
测试自己写的栈
#include<iostream>
#include<list>
using namespace std;
int main()
{
stack<int,list<int>> st;
st.push(1) //插入数据
st.push(2) //插入数据
st.push(3) //插入数据
while(!st.empty) // 判断不为空就继续
{
cout<<st.top()<<" "; // 取出栈顶的元素
st.pop(); // //删除栈顶元素
}
cout<<endl;
return 0
}
运行结果:
queue的模拟实现
queue是一种容器适配器,专门设计用于在FIFO(先进先出)中操作,其中元素插入容器的一端并从另一端提取。
我们先看库里面的queue,他有两个模板参数,第二个参数是一个容器,库里的写成了一个缺省参数当我们不传容器时,默认就是容器deque.
template<class T,class container>
class queue
{
public:
private:
container _con;
};
注意:和stack一样,我们模拟实现的是没有缺省参数的,当我们使用自己写的stack是要传两个参数。
queue的成员函数:
template<class T ,class container>
{
public:
void push(const T& x)
{
_con.push_back();
}
void pop()
{
_con.pop_back();
}
size_t size()
{
return _con.size();
}
bool empty()
{
return _con.emnpty
}
T& front()
{
return _con.front();
}
T& back()
{
return _con.back();
}
private:
containar _con;
}
测试自己写的queue
#include<iostream>
#include<list>
using namespace std;
int main()
{
queue<int,list<int>> q;
q.push(1) //插入数据
q.push(2) //插入数据
q.push(3) //插入数据
while(!q.empty) // 判断不为空就继续
{
cout<<q.front()<<" "; // 取出栈顶的元素
st.pop(); // //删除栈顶元素
}
cout<<endl;
return 0
}
运行结果:
对于deque容器 我们下篇再讲。
文章尚有不足,欢迎大牛指正
如果本文对您有帮助请点赞支持一下~