ps:以下问答均基于c++
C++中stack 是容器么?
可能一听到这个问题大家都会疑惑,STL中的vector、queue、stack、map、list、set不都是归为容器的吗?广义上来讲是这样的,不过确切来说,像stack(后进先出)、queue(先进先出) 、priority_queue(最高优先级元素总是第一个出列)这三个所谓的“容器”,一种更贴切的名字可能更适合它们——容器适配器。那么什么是容器适配器呢?
适配器是标准库中通用的概念,包括容器适配器、迭代器适配器和函数适配器。本质上,适配器是使一事物的行为类似于另一类事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。通俗来说,所谓适配器,就是把一种接口转换为另一种接口。比如电源适配器把220v电压转为5v,比如串口转usb适配器把信号类型进行转换。
栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。所以STL中栈往往被归类为container adapter(容器适配器)。
我们使用的stack是属于哪个版本的STL?
首先我们来了解一下几个主要版本的STL:as depicted below~~~
1、HP版本是所有STL实现版本的始祖。HP STL 其他版本的C++ STL,一般是以HP STL为蓝本实现出来的,HP STL是C++ STL的第一个实现版本,而且开放源代码。
2、P.J.Plauger STL 由P.J.Plauger参照HP STL实现出来的,被Visual C++编译器所采用,不是开源的(听说可读性好像不大友好的样子~)。
3、SGI STL 由Silicon Graphics Computer Systems公司参照HP STL实现,被Linux的C++编译器GCC所采用,SGI STL是开源软件,源码可读性甚高。
4、Rouge Wave实现版本。Rouge Wave版本是由Rouge Wave公司开发,它继承HP版本,并不属于open source范畴。Rouge Wave版本被C++Builder采用。
5、STLport实现版本。为了使SGI STL的基本代码都适用于VC++和C++ Builder等多种编译器,俄国人Boris Fomitchev建立了一个free项目来开发STLport,此版本STL是开放源码的。(似乎是不再更新,并不支持C++11)
不同的版本有不同的底层实现,我们以SGI STL里面的数据结构来展开~~~
我们使用的STL中stack是如何实现的?
stack 实现原理
以某种既有容器作为底部结构,将其接口改变,使之符合“先进后出”的特性,形成一个 stack,是很容易做到的。deque是一个双向队列,只要封住一段,只开通另一端就可以实现栈的逻辑了。因此,STL便以 deque 作为缺省情况下的 stack 底部结构。
栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。
ps:队列中先进先出的数据结构,同样不允许有遍历行为,不提供迭代器, SGI STL中队列一样是以deque为缺省情况下的底部结构。
stack 提供迭代器来遍历stack空间么?
栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。