C++9.7、9.8 容器适配器----queue、stack

本文介绍了栈、队列和优先级队列的基本概念、使用方法及其实现细节,详细解释了如何通过适配器技术调整不同容器类型以满足特定需求。同时,通过实例演示了栈的操作、队列的先进先出特性以及优先级队列的优先级排序机制。

简介

  • 使用适配器时,必须包含相关的头文件:

    • #include< stack >
    • #include< queue >

    • stack 适配器所关联的基础容器可以是任意一种顺序容器类型,因此,stack栈可以建立在vector、list或者deque容器之上。

    • queue适配器要求其关联的基础容器必须提供push_front运算,因此只能建立在list容器上,而不能建立在vector容器上(vector容器增删元素不方便 9.5节)。

    • priority_queue 适配器要求提供随机访问功能,因此可以建立在vector或deque容器上,但不能建立在list容器上。

  • 默认的stack和queue都基于deque容器实现,而priority_queue则在vector容器上实现。

参照—–9.5 容器的区别

==================================================================================================================================================

一、适配器

  • 除了顺序容器外,标准库还提供了三种顺序容器适配器:queue、priority_queue、stack。

  • 适配器是标准库通用概念,包括容器适配器、迭代适配器和函数适配器

  • 本质上,迭代器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器让一种已经存在的容器类型采用另一种不同的抽象类型的工作方式表现。例如,stack栈适配器可使任何一种顺序容器以栈的方式工作

这里写图片描述

  • 使用适配器时,必须包含相关的头文件:
#include< stack >
#include< queue >

1. 适配器的初始化

  • 所有的适配器都定义了两个构造函数:默认构造函数用于创建空对象,而带一个容器参数的构造函数将参数容器的副本作为其基础值。
stack<int> stk(deq);//用deq初始化一个新的栈。deq是deque<int>类型的容器

2. 覆盖基础容器类型

  • 默认的stack和queue都基于deque容器实现,而priority_queue则在vector容器上实现。

  • 在创建适配器时,通过将一个顺序容器指定为适配器的第二个类型实参,可覆盖其关联的基础容器类型:

stack<string,vector<string>> str_stk;
stack<string,vector<string>> str_stk2(svec);

3.不同的适配器关联不同的容器

  • 对于给定的适配器,其关联的容器必须满足一定的约束条件。

    • stack 适配器所关联的基础容器可以是任意一种顺序容器类型,因此,stack栈可以建立在vector、list或者deque容器之上。

    • queue适配器要求其关联的基础容器必须提供push_front运算,因此只能建立在list容器上,而不能建立在vector容器上(vector容器增删元素不方便 9.5节)。

    • priority_queue 适配器要求提供随机访问功能,因此可以建立在vector或deque容器上,但不能建立在list容器上。

4.适配器的关系运算

  • 两个相同类型的适配器可以做相等、不等、小于大于等于以及大于等于关系比较,只要基础元素类型支持等于和小于操作符即可。

    • 这些关系运算由元素依次比较来实现,第一对不相等的元素将决定两者之间的小于或大于关系。

二、栈适配器

这里写图片描述

const stack<int>::size_type stk_size = 10;
stack<int> intStack;//空栈
int ix=0;
while(intStack.size()!=stk_size)//在该栈中添加了stk_size个元素
  intStack.push(ix++);//0--9//因为默认的栈适配器都是建立在deque容器上,因此采用deque提供的操作来实现栈功能。这个操作通过调研push_back操作实现,
int errot_cnt=0;
while(intStack.empty()==false) //检测栈顶的元素值,然后栈顶元素出栈
{

 int value = intStack.top();
 if(value!=--ix){
    cerr<<"oops!  expected"<<ix
        <<"received"<<value<<endl;
        ++error_cnt;
}
intStack.pop();//删除栈顶元素
}
cout<<"our program ran with"
    <<error_cnt<<"errors!"<<endl;

二、队列queue和优先级队列priority_queue

  • 标准库队列使用了先进先出的存储和检索策略。

  • 进入队列的对象被放置在尾部, 下一个被取出的元素则取自队列的首部

  • 队列有两种风格:FIFO队列(queue),优先级队列(priority_queue)

    • priority_queue允许用户为队列中存储的元素设置优先级,这种队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面。

    • * 标准库默认使用元素类型的 < 操作符来确定他们之间的优先级 *

    • 要使用两种队列,必须包含queue头文件

这里写图片描述

//习题 9.43 这道题和数据结构里某道题很类似,括弧匹配
#include <iostream>
#include<string>
#include<cstring>
#include<stack>
using namespace std;
int main()
{
stack<char> sexp;
string exp;
cin>>exp;
string::iterator iter =exp.begin();
while(iter!=exp.end()){
       if(*iter!=')')
       sexp.push(*iter);
       else
       {//读到的字符是右圆括号,弹出元素,直到栈顶为左括号或栈为空
       while (sexp.top() !='(' && !sexp.empty())
              sexp.pop();//删除栈顶元素

       if(sexp.empty())
       cout<<"efrfrtgg"<endl;
       else//栈顶为左圆括号
       {
           sexp.pop();//删除栈顶元素
           sexp.push('@');
       }
      }
       ++iter;

}
    return 0;
}
代码下载地址: https://pan.quark.cn/s/bc087ffa872a "测控电路课后习题详解"文件.pdf是一份极具价值的学术资料,其中系统地阐述了测控电路的基础理论、系统构造、核心特性及其实际应用领域。 以下是对该文献的深入解读和系统梳理:1.1测控电路在测控系统中的核心功能测控电路在测控系统的整体架构中扮演着不可或缺的角色。 它承担着对传感器输出信号进行放大、滤除杂音、提取有效信息等关键任务,并且依据测量与控制的需求,执行必要的计算、处理与变换操作,最终输出能够驱动执行机构运作的指令信号。 测控电路作为测控系统中最具可塑性的部分,具备易于放大信号、转换模式、传输数据以及适应多样化应用场景的优势。 1.2决定测控电路精确度的关键要素影响测控电路精确度的核心要素包括:(1)噪声与干扰的存在;(2)失调现象与漂移效应,尤其是温度引起的漂移;(3)线性表现与保真度水平;(4)输入输出阻抗的特性影响。 在这些要素中,噪声干扰与失调漂移(含温度效应)是最为关键的因素,需要给予高度关注。 1.3测控电路的适应性表现测控电路在测控系统中展现出高度的适应性,具体表现在:* 具备选择特定信号、灵活实施各类转换以及进行信号处理与运算的能力* 实现模数转换与数模转换功能* 在直流与交流、电压与电流信号之间进行灵活转换* 在幅值、相位、频率与脉宽信号等不同参数间进行转换* 实现量程调整功能* 对信号实施多样化的处理与运算,如计算平均值、差值、峰值、绝对值,进行求导数、积分运算等,以及实现非线性环节的线性化处理、逻辑判断等操作1.4测量电路输入信号类型对电路结构设计的影响测量电路的输入信号类型对其电路结构设计产生显著影响。 依据传感器的类型差异,输入信号的形态也呈现多样性。 主要可分为...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值