顺序容器适配器

本文详细介绍了C++标准库中的三种顺序容器适配器:queue、priority_queue和stack。解释了它们如何基于基础容器如deque和vector实现,并概述了每种适配器支持的主要操作。

  标准库提供三种顺序容器适配器,分别是queue, priority_queue, stack。适配器是标准库中通用的概念,包括容器适配器、迭代器适配器和函数适配器。本质上,适配器是使一事物的行为类似于另一事物行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。例如栈适配器可使任一种顺序容器以栈的方式工作,即容器适配器是基于一种基础容器类型实现的。

//适配器的初始化

stack<int> stk(deq); //copy elements from deq into stk,deq是deque<int>类型的容器。

//默认的stack和queue都是通过deque容器实现的,而priority_queue则实在vector容器上实现。在创建适配器时,通过将一个顺序容器指定为适配器的第二个类型实参,可覆盖其关联的基础容器类型
stack<string,vector<string> > str_stk;
stack<string, vector<string> > str_stk2(svec);
//stack适配器所关联的基础容器可以是任意一种顺序容器类型,而queue要求所关联的基础容器必须要有push_front()运算,所以只能建立在list和deque容器上。priority_queue要求提供随机访问功能,所以不能建立在list上


//栈适配器支持的操作
s.empty() 
s.size()
s.pop()
s.push(item);
s.top();

//队列和优先队列支持的操作
q.empty()
q.size()
q.pop();
q.front()//只适用于队列 
q.back()//只适用于队列 
q.top() //只适用于优先队列 
q.push(iterm) 


容器适配器是一种将现有的容器类型适配为不同接口的容器的工具,是一种设计模式,该种模式是将一个类的接口转换成客户希望的另外一个接口 [^4][^5]。它本身不能直接保存元素,保存元素的机制是调用另一种顺序容器去实现 [^1]。 C++标准库提供了三种主要的容器适配器:栈(stack)、队列(queue)和优先队列(priority_queue)。这些适配器都是基于现有的序列容器(如vector、deque或list)实现的,但提供了不同的接口和行为 [^5]。 ### 栈(stack) 栈是一种后进先出(LIFO)的数据结构,它只允许在栈顶进行插入和删除操作。在C++中,栈适配器基于deque或vector实现,提供了push、pop、top等操作。标准容器vector、deque、list均符合栈的需求,默认情况下,如果没有为stack指定特定的底层容器,使用deque。可通过模板参数指定底层容器,例如使用vector作为stack的底层容器: ```cpp #include <stack> #include <vector> std::stack<int, std::vector<int>> stackWithVector; ``` 栈适用于递归模拟、表达式求值等场景 [^2][^3][^5]。 ### 队列(queue) 队列是一种先进先出(FIFO)的数据结构,它允许在队列的前端进行删除操作,在队列的后端进行插入操作。在C++中,队列适配器基于deque或list实现,提供了push、pop、front、back等操作。可以使用list作为queue的底层容器: ```cpp #include <queue> #include <list> std::queue<int, std::list<int>> queueWithList; ``` 队列适用于任务调度、广度优先搜索等场景 [^2][^5]。 ### 优先队列(priority_queue) 优先队列是一种特殊的队列,它根据元素的优先级进行排序。在C++中,优先队列适配器基于vector实现,提供了push、pop、top等操作。优先队列适用于任务调度(按优先级)、贪心算法等场景 [^2][^5]。 ```cpp #include <queue> std::priority_queue<int> priorityQueue; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值