目录
Stack
杂谈
如上图第一个红框处,stack也是一个类模板。第一个模板参数表示stack存储元素的类型是什么,第二个模板参数和stack的底层实现有关,因为stack是容器适配器, 关于设配器,笔者会在模拟实现中具体说明,第二个模板参数表示容器适配器stack底层是利用什么容器实现的,可以看到缺省值是deque<T>,所以stack默认的底层容器就是deque。
那什么样的容器才有资格成为stack的底层容器呢?如第二个红框处所示,底层容器可以是任何标准容器类模板或一些其他专门设计的容器类,容器必须支持以下操作:empty、size、back、push_back、pop_back。标准容器类vector、deque和list就满足了这些要求。默认情况下,如果没有为stack类模板在实例化时指定底层容器类,则默认使用标准容器deque。
栈的逻辑图如下所示。
如下图所示,可以看到对于stack,我们是没有为它实现迭代器类的,原因很简单,你可以想想,如果实现了一个迭代器类,那stack还能保证它后进先出的性质吗?答案是不能,如果有了迭代器,我们是能随心所欲的访问元素的。
构造函数
因为有缺省值,所以构造stack默认可以不传参数。那构造函数的参数ctnr表示什么呢?前面也说过stack是一个容器适配器,所以该参数表示你想用什么底层容器为基础去构造stack,可以是vector、可以是list,如果不指定则默认是deque。
empty
该函数用于判断stack是否为空,即判断存储的有效数据的个数是否为0,若为空则返回true,否则返回flase。
size
该函数用于返回stack中存储的有效数据的个数,注意返回值的类型是size_t而不是int。
top
该函数用于返回栈顶元素的引用,如上图所示,value_type这个类型就是stack<T>中的T的类型。
push
函数用于往栈顶插入一个value_type类型也就是T类型的元素。
emplace
emplace的功能和push一致,都是插入元素,那区别在哪呢。
用法上的区别如下所示。
效率上的区别如下所示。
pop
该函数用于删除栈顶的元素。
swap
该函数用于交换两个stack中管理的数据。
queue
对于queue的性质,除了queue是先进先出这一点性质和stack不一样,其余所有性质二者都是完全相同的,比如queue也是一个容器适配器,默认适配的容器也是deque。对于queue的操作函数,除了queue没有stack的top函数,以及stack没有queue的back和front函数,其余接口的使用方法是和stack完全一致的。
一个容器类需要支持哪些成员函数才能让queue这个容器适配器适配呢?
对于这一点,queue和stack也不相同,区别如下图所示。