目录
容器适配器
容器适配器(Container Adapter)是一种设计模式,在 C++ 的标准模板库(STL)中,它是一种特殊的容器。容器适配器本质上是对已有容器进行包装,提供了一种受限的、特定用途的接口,以适应特定的编程需求。它并不提供像普通容器(如vector
、list
等)那样完整的功能集,而是专注于实现特定的操作模式。
常见的容器适配器,有栈(stack),队列(queue),优先队列(priority queue)。
STL中的栈和队列适配器通常是基于deque实现的,deque是一个双端队列,它的底层实现较为巧妙,感兴趣的可以自己去看一下,这里就不做讲解了
而优先队列适配器是基于堆来实现的,下一篇博客我们会对它进行讲解。
stack的模拟实现
在stack的类模板声明中我们可以看到有两个参数,第一个是stack中所存储的元素类型,第二个是指定使用的容器类型,默认情况下是deque。
如果我们可以指定容器,那我们就可以直接调用指定容器的接口。
简单理解:学过数据结构后我们都知道,stack和queue既可以使用顺序表实现,也可以使用链表实现。在这里我们若是定义一个stack,并指定使用vector容器,则定义出来的stack实际上就是对vector容器进行了包装。
栈的接口从上一篇中我们都已经知道了。所以这里直接上代码
#pragma once
#include<vector>
#include<list>
#include<deque>
namespace My_stack
{
template<class T, class Container = std::deque<T>>
class stack
{
public:
//入栈
void push(const T& x)
{
_con.push_back(x);
}
//出栈
void pop()
{
_con.pop_back();
}
//获取栈顶元素
const T& top() const
{
return _con.back();
}
//栈的大小
size_t size() const
{
return _con.size();
}
//栈是否为空
bool empty() const
{
return _con.empty();
}
void swap(stack<T, Container>& st)
{
_con.swap(st._con);
}
private:
Container _con;
};
}
代码非常简单,queue的模拟也同理。
queue的模拟实现
#pragma once
#include<vector>
#include<list>
#include<deque>
namespace My_Queue
{
template<class T, class Container = std::deque<T>>
class queue
{
public:
//入队
void push(const T& x)
{
_con.push_back(x);
}
//出队
void pop()
{
_con.pop_front();
}
//获取队头
const T& front() const
{
return _con.front();
}
//获取队尾
const T& back() const
{
return _con.back();
}
//队列大小
size_t size() const
{
return _con.size();
}
//判空
bool empty() const
{
return _con.empty();
}
//交换队列
void swap(queue<T, Container>& q)
{
swap(q._con);
}
private:
Container _con;
};
}