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;
}
【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局与动态调度策略。通过Matlab代码实现,提出了一种结合预配置和动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了多种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性和优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划与电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据和技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置与动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
先看效果: https://pan.quark.cn/s/3756295eddc9 在C#软件开发过程中,DateTimePicker组件被视为一种常见且关键的构成部分,它为用户提供了图形化的途径来选取日期与时间。 此类控件多应用于需要用户输入日期或时间数据的场景,例如日程管理、订单管理或时间记录等情境。 针对这一主题,我们将细致研究DateTimePicker的操作方法、具备的功能以及相关的C#编程理念。 DateTimePicker控件是由.NET Framework所支持的一种界面组件,适用于在Windows Forms应用程序中部署。 在构建阶段,程序员能够通过调整属性来设定其视觉形态及运作模式,诸如设定日期的显示格式、是否展现时间选项、预设的初始值等。 在执行阶段,用户能够通过点击日历图标的下拉列表来选定日期,或是在文本区域直接键入日期信息,随后按下Tab键或回车键以确认所选定的内容。 在C#语言中,DateTime结构是处理日期与时间数据的核心,而DateTimePicker控件的值则表现为DateTime类型的实例。 用户能够借助`Value`属性来读取或设定用户所选择的日期与时间。 例如,以下代码片段展示了如何为DateTimePicker设定初始的日期值:```csharpDateTimePicker dateTimePicker = new DateTimePicker();dateTimePicker.Value = DateTime.Now;```再者,DateTimePicker控件还内置了事件响应机制,比如`ValueChanged`事件,当用户修改日期或时间时会自动激活。 开发者可以注册该事件以执行特定的功能,例如进行输入验证或更新关联的数据:``...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值