容器适配器 —— stack:栈 queue:队列 priority_queue:优先级队列

本文介绍了STL中的三种容器适配器:stack(栈)、queue(队列)和priority_queue(优先级队列),详细阐述了它们的特点、默认底层容器及常用操作。栈遵循先进后出原则,队列遵循先进先出原则,而优先级队列则按照优先级排序。所有适配器不支持迭代器,并提供了如push、pop、size、empty等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适配器使一种事物的行为类似另外一种事物行为的一种机制

容器适配器没有自己的数据结构,底层调用其它容器的数据结构对容器进行包装,使其表现出另外一种行为

 

标准库提供了三种顺序容器适配器stack(栈 :先进后出)  queue(队列 :先进先出)  priority_queue(优先级队列 :按照优先级(“<”号)排序) ,不支持迭代器

 

使用容器适配器需要的头文件有:

#include <stack>        //stack

#include<queue>       //queue、priority_queue

 

默认情况下,栈和队列都是基于deque实现的,而优先级队列则是基于vector实现的。

stack的特点是先进后出,所以它可用任意一种顺序容器

队列queue的特点是先进先出,必须提供pop_front操作,因此不能建立在vector容器上优先级队列priority_queue,支持随机访问,所以可建在vector或者deque上,不能建立在list上

种类

特点

默认顺序容器

可用顺序容器

不可用顺序容器

stack

先进后出,可用任意一种顺序容器

deque

vector、list、deque

queue

先进先出,必须提供pop_front操作

deque

list、deque

vector

priority_queue

要支持随机访问

vector

vector、deque

list

 

stack 提供的操作:

* top():返回一个栈顶元素的引用,类型为 T&。如果栈为空,返回值未定义。

* push(const T& obj):可以将对象副本压入栈顶。这是通过调用底层容器的 push_back() 函数完成的。

* push(T&& obj):以移动对象的方式将对象压入栈顶。这是通过调用底层容器的有右值引用参数的 push_back() 函数完成的。

* pop():弹出栈顶元素。

* size():返回栈中元素的个数。

* empty():在栈中没有元素的情况下返回 true。

* emplace():用传入的参数调用构造函数,在栈顶生成对象。

* swap(stack<T> & other_stack):将当前栈中的元素和参数中的元素交换。参数所包含元素的类型必须和当前栈的相同。对于 stack 对象有一个特例化的全局函数 swap() 可以使用。

 

queue 提供的操作

* front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。

* back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。

* push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。

* push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。

* pop():删除 queue 中的第一个元素。

* size():返回 queue 中元素的个数。

* empty():如果 queue 中没有元素的话,返回 true。

* emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。

* swap(queue<T> &other_q):将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。

 

priority_queue 提供的操作

* push(const T& obj):将obj的副本放到容器的适当位置,这通常会包含一个排序操作。

* push(T&& obj):将obj放到容器的适当位置,这通常会包含一个排序操作。

* emplace(T constructor a rgs...):通过调用传入参数的构造函数,在序列的适当位置构造一个T对象。为了维持优先顺序,通常需要一个排序操作。

* top():返回优先级队列中第一个元素的引用。

* pop():移除第一个元素。

* size():返回队列中元素的个数。

* empty():如果队列为空的话,返回true。

* swap(priority_queue<T>& other):和参数的元素进行交换,所包含对象的类型必须相同。

 ********************************************* 容器的总结 ********************************************

标准库容器类

说明

顺序容器

 

vector(参量)

1.扩容按倍数增长,导致空间浪费:假设刚开始 2 个空间,使用1个,另一个浪费;pop也浪费空间                        

2.可以从后面快速插入、删除为O(1),从前头插入或删除为O(n)

3.直接访问任何元素 

 list(双向循环链表)

1.链表里面使用多少个申请多少个,不会浪费空间            

2.头插、尾插、头删、尾删为O(1)                          

3.从任意地方快速插入与删除                                

4.双链表需遍历每次节点,访问速度较慢

 deque(双端队列)

支持在两端快速插入和删除,直接访问任何元素

关联容器

 

set(集合)

快速查找,不允许重复值

multiset(多重集合)

快速查找,允许重复值

map(映射)

一对一映射,基于关键字快速查找,不允许重复值

multimap(多重映射)

一对多映射,基于关键字快速查找,允许重复值

容器适配器

 

stack(栈)

后进先出(LIFO)

queue(队列)

先进后出(FIFO)

priority_queue(优先级队列)

最高优先级元素总是第一个出列

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值