STL其他内容解析:关于C++中STL的理解和应用
容器适配器简介:
C++中的容器适配器是干什么的呢?我们已有容器(比如vector、list、deque),他们支持的的操作很多,比如插入,删除,迭代器访问等等。而我们希望这个容器表现出来的是栈的样子:先进后出,入栈出栈等等,此时,我们没有必要重新动手写一个新的数据结构,而是把原来的容器重新封装一下,改变它的接口,就能把它当做栈使用了。
C++中定义了3种容器适配器,它们让容器提供的接口变成了我们常用的的3种数据结构:栈stack,队列queue和优先队列priority_queue。
默认情况下,栈和队列都是基于deque实现的,而优先级队列则是基于vector实现的。
当然,我们也可以指定自己的实现方式。但是由于数据结构的关系,我们也不能胡乱指定。栈的特点是后进先出,所以它关联的基本容器可以是任意一种顺序容器,因为这些容器类型结构都可以提供栈的操作有求,它们都提供了push_back、pop_back和back操作。 队列queue的特点是先进先出,适配器要求其关联的基础容器必须提供pop_front操作,因此其不能建立在vector容器上;对于优先级队列,由于它要求支持随机访问的功能,所以可以建立在vector或者deque上,不能建立在list上。
自定义适配器:
- stack适配器要求能够push_back,pop_back,back操作,所以stack可以建立在vector、deque、list上(array,forward_list不可以)。
- queue适配器要求容器具有back,push_back,push_front操作,因此可以在list和deque上构造(vector没有front这个操作)。
- priority_queue要求容器具有push_back,pop_back,以及随机访问(用来排序)的操作。所以可以用vector和deque。但是不能建立在list上。
例如:
stack<int, list<int>> s1;
stack<int, vector<int>> s2;
没有迭代器:
C ++迭代器用于对数据结构中的元素进行顺序访问或随机访问。因此,对于根据定义不允许顺序或随机访问的数据结构,迭代器没有任何意义。这就是堆栈和队列没有迭代器的原因。另一方面,向量和列表允许对元素进行顺序和/或随机访问,因此迭代器对于导航这些数据结构是有意义的。
适配器详解:
C++ STL队列queue和优先队列priority_queue的底层实现和用法