Container
//创建一个命名空间,避免和库里的冲突
namespace chen
{
//写一个模版
template<class T, class Container = deque<T>>
//开始写我们的类
class stack
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_back();
}
const T& top()
{
_con.back();
}
bool empty()
{
return _com.empty();
}
size_t size()
{
return _con.size();
}
private:
Container _con;
};
}
上面代码就是一个容器适配器,这上面的代码可以被认为是一个容器适配器,因为它采用了一个已有的容器(通过模板参数 Container
)来实现栈的功能。容器适配器是一种在标准容器之上提供额外接口或修改现有接口的抽象层。
让我们看看为什么这个类可以被看作是一个容器适配器:
-
使用模板参数
Container
:通过使用模板参数Container
,这个栈类允许用户选择不同的容器类型来存储数据。用户可以传入任何符合栈要求的容器,例如std::vector
、std::deque
、或者其他符合要求的容器类型。 -
封装容器操作:该栈类封装了底层容器的操作,如
push_back
、pop_back
、back
等,通过公共接口提供对这些操作的访问。这使得用户可以使用栈的接口而不必直接与底层容器进行交互。 -
提供栈的特定接口:栈有其自己的特定接口,如
push
、pop
、top
、empty
和size
。这些接口反映了栈的行为,而底层容器的细节被封装在栈类内部。
因此,尽管 stack
类使用了一个已有的容器,但它提供了栈的抽象接口,允许用户通过栈的方式使用底层容器。这种通过封装和提供特定接口的方式,使得栈类成为容器适配器。
deque
deque(双端队列)是C++标准库中的一种容器,它是一种双向开口的连续线性空间,可以在头部和尾部进行快速的插入和删除操作。deque是"double-ended queue"的缩写,它允许在队列的两端执行高效的操作。
以下是deque的一些特点和解释:
-
双向开口:deque允许在头部和尾部进行元素的插入和删除操作,而且这些操作都是高效的,不会像vector那样需要移动大量元素。
-
连续线性空间:deque内部通常由多个连续的缓冲区组成,这些缓冲区会动态分配和管理,以保持高效的操作。这种设计使得deque可以在内部分段存储数据,而不需要像vector那样连续存储。
-
随机访问:deque支持随机访问,就像数组一样,可以通过索引来访问元素,而且访问操作的时间复杂度是常数时间。
-
动态增长:deque可以动态增长,当需要存储更多元素时,会自动分配新的缓冲区,并将元素复制到新的缓冲区中。
-
插入和删除效率高:由于deque的双向开口特性,插入和删除元素的效率非常高,不仅仅限于队列的末尾,还可以在队列的前端进行操作。
总之,deque是一种非常灵活和高效的数据结构,适用于需要频繁在队列两端进行操作的情况。它是STL(标准模板库)中的一个重要组件,可以用来解决各种问题,包括队列、栈、双端队列等。
deque(双端队列)不仅可以对队头和队尾的元素进行操作,还可以对队列中间的元素进行操作。这是deque与其他容器(如vector)的主要不同之处。
deque支持以下操作:
-
头部插入和删除:你可以在deque的头部插入元素,也可以从头部删除元素,这些操作是高效的。
-
尾部插入和删除:类似地,你可以在deque的尾部插入元素,也可以从尾部删除元素,这也是高效的。
-
中间插入和删除:deque允许在队列中间插入元素或删除元素,虽然这些操作相对于头部和尾部的操作来说稍微复杂一些,但依然是高效的。你可以使用迭代器来访问和操作deque中的任何元素。
这种双向开口的特性使deque非常灵活,可以用于各种场景,不仅仅局限于队列的两端操作。deque在需要随机访问、插入和删除操作的情况下非常有用,因为它可以在常数时间内执行这些操作,而不需要移动大量元素。这使得deque成为STL中一个重要的容器类型。
但是 deque
只是会的多,你可以理解为:会的比vector
和 list
多,但不精通
template< class T, class Container = deque<T> >
这是C++中的模板类定义,具体解释如下:
template< class T, class Container = std::deque<T> >
-
template<...>
: 这是模板的声明,表明接下来定义的是一个模板类或模板函数。 -
class T
: 这里定义了一个模板参数T
,表示该模板类将接受一个类型参数。T
是用户在使用该模板类时需要提供的类型。 -
class Container = std::deque<T>
: 这是另一个模板参数Container
,它有一个默认值为std::deque<T>
。这意味着用户可以选择在使用该模板类时提供自定义的容器类型,如果未提供,则默认使用std::deque<T>
作为容器类型。std::deque<T>
是 C++ 标准库中的双端队列容器,它允许在两端高效地进行元素的插入和删除操作。
所以,这个模板类 stack
接受两个模板参数:
T
:表示栈中存储的元素类型。Container
:表示存储元素的容器类型,默认为std::deque<T>
。
这种设计使得用户可以根据需要选择不同的元素类型和容器类型来实例化这个栈类。例如,可以实例化一个存储 int
类型的栈,使用默认的容器类型 std::deque<int>
,也可以实例化一个存储 double
类型的栈,使用其他自定义容器类型。