6 - 容器适配器与分配器
容器适配器
标准库还提供了3种容器适配器:queue
,priority_queue
和stack
。每种容器适配器都是对一种顺序容器的包装,它们的作用就是简化接口,例如stack
不需要对末尾元素做修改等。
queue
queue
容器适配器定义在<queue>
头文件中,提供标准的“先入先出”语义。它的定义如下:
template <class T, class Container = deque<T>> class queue;
可见queue
默认是使用deque
为底层容器的,queue
的底层容器是支持push_back()
和pop_front()
操作的顺序容器,有deque
和list
。
它支持的操作有:
push()
和emplace()
:在尾部添加一个元素pop()
:移除头部的一个元素front()
和back()
:获得队头和队尾元素的引用size()
,empty()
和swap()
priority_queue
优先队列保证在队列头部的元素任何时刻都具有最高优先级,定义在<queue>
头文件中。它的定义如下(简化了):
template <class T, class Container = vector<T>, class Compare = less<T>>;
可见优先队列默认用vector
作为底层容器,也能用deque
,但不能用list
,因为它不能随机访问元素。
它支持的操作有:
push()
和emplace()
:插入元素pop()
:删除元素top()
:返回队头元素的const引用,防止元素被修改size()
,empty()
和swap()
stack
栈和队列类似,区别在于栈是先入后出的。它定义在<stack>
头文件中,定义如下:
template <class T, class Container = deque<T>> class stack;
它支持的操作有:
push()
和emplace()
:在栈顶添加一个新元素pop()
:在栈顶删除一个元素top()
:返回栈顶元素size()
,empty()
和swap()
分配器
在分配动态内存时,直接使用 new,delete 容易产生内存碎片化的问题,不同的分配器有不同的分配内存的方法,可以大幅提高程序对堆内存的使用效率,在成为C++大师前,直接使用默认的分配器就可以了
参考资料
- 飘零的落花 - 现代C++详解
- C++20高级编程