C++ (Standard Template Library - STL) 容器适配器

C++ (Standard Template Library - STL) 容器适配器

容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。

3 种容器适配器:
stack<T>:是一个封装了 deque<T> 容器的适配器类模板,默认实现的是一个后入先出 (Last-In-First-Out,LIFO) 的压入栈。stack<T> 模板定义在头文件 stack 中。
queue<T> 是一个封装了 deque<T> 容器的适配器类模板,默认实现的是一个先入先出 (First-In-First-Out,LIFO) 的队列。可以为它指定一个符合确定条件的基础容器。queue<T> 模板定义在头文件 queue 中。
priority_queue<T>:是一个封装了 vector<T> 容器的适配器类模板,默认实现的是一个会对元素排序,从而保证最大元素总在队列最前面的队列。priority_queue<T> 模板定义在头文件 queue 中。

适配器类在基础序列容器的基础上实现了一些自己的操作,显然也可以添加一些自己的操作。它们提供的优势是简化了公共接口,而且提高了代码的可读性。

1. queue<T>

  • 只能访问 queue<T> 容器适配器的第一个和最后一个元素。
  • 只能在容器的末尾添加新元素,只能从容器的头部移除元素。
  • queue 容器可以用来表示超市的结账队列或服务器上等待执行的数据库事务队列。对于任何需要用 FIFO 准则处理的序列来说,使用 queue 容器适配器都是好的选择。

在这里插入图片描述

  • queue 容器中访问元素的唯一方式是遍历容器内容,并移除访问过的每一个元素。为了访问 queue 中的全部元素,必须删除它们。如果不想删除容器中的元素,必须将它们复制到另一个容器中。如果一定要这么操作,我们可能需要换一个容器。

2. stack<T>

stack<T> 容器适配器中的数据是以 (Last-In-First-Out,LIFO) 的方式组织的,这和自助餐馆中堆叠的盘子、箱子中的一堆书类似。只能访问 stack 顶部的元素,只有在移除 stack 顶部的元素后,才能访问下方的元素。

在这里插入图片描述

  • stack 容器有广泛的应用。例如,编辑器中的 undo (撤销) 机制就是用堆栈来记录连续的变化。撤销操作可以取消最后一个操作,这也是发生在堆栈顶部的操作。编译器使用堆栈来解析算术表达式,当然也可以用堆栈来记录 C++ 代码的函数调用。
  • stack 容器适配器的模板有两个参数。第一个参数是存储对象的类型,第二个参数是底层容器的类型。stack<T> 的底层容器默认是 deque<T> 容器。
  • 创建堆栈时,不能在初始化列表中用对象来初始化,但是可以用另一个容器来初始化,只要堆栈的底层容器类型和这个容器的类型相同。

3. priority_queue<T>

  • priority_queue 容器适配器定义了一个元素有序排列的队列。默认队列头部的元素优先级最高。因为它是一个队列,所以只能访问第一个元素,这也意味着优先级最高的元素总是第一个被处理。如果一个优先级队列记录的是医院里等待接受急救的病人,那么病人病情的严重性就是优先级。如果队列元素是银行的借贷业务,那么借记可能会优先于信贷。
  • priority_queue 模板有 3 个参数,其中两个有默认的参数,第一个参数是存储对象的类型,第二个参数是存储元素的底层容器,第三个参数是函数对象,它定义了一个用来决定元素顺序的断言。
  • priority_queue 实例默认有一个 vector 容器。函数对象类型 less<T> 是一个默认的排序断言,定义在头文件 function 中,决定了容器中最大的元素会排在队列前面。fonction 中定义了 greater<T>,用来作为模板的最后一个参数对元素排序,最小元素会排在队列前面。当然,如果指定模板的最巵一个参数,就必须提供另外的两个模板类型参数。

在这里插入图片描述

发布了509 篇原创文章 · 获赞 1824 · 访问量 110万+

猜你喜欢

转载自blog.csdn.net/chengyq116/article/details/104594317