6 - 容器适配器与分配器

容器适配器

标准库还提供了3种容器适配器:queuepriority_queuestack。每种容器适配器都是对一种顺序容器的包装,它们的作用就是简化接口,例如stack不需要对末尾元素做修改等。

queue

queue容器适配器定义在<queue>头文件中,提供标准的“先入先出”语义。它的定义如下:

template <class T, class Container = deque<T>> class queue;

可见queue默认是使用deque为底层容器的,queue的底层容器是支持push_back()pop_front()操作的顺序容器,有dequelist

它支持的操作有:

  • 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高级编程