当前位置: 首页 > news >正文

[C++]反向迭代器

目录

前言:

1 对反向迭代器的构造思想

2 实现反向迭代器

3 完整代码


前言:

        本篇文章主要介绍了STL容器当中的反向迭代器,可能有朋友会说:“反向迭代器有什么好学的?不一样还是迭代器吗,我正向能写出来,还写不出反向?”有这种想法的朋友那你可得好好的看看咯,相信这对你有很大的帮助。

1 对反向迭代器的构造思想

        以同类逻辑去考虑迭代器,我们反向迭代器应该与正向迭代器构造思想相同,正向迭代器的begin指向第一个数据,end指向最后一个数据的后一位,那么我们的反向迭代器也应该是rbegin指向倒数第一个数据,rend指向第一个数据的前一位,如下图:

         我相信大多数人对于第一次遇到反向迭代器的想法都是这样的,包括博主自己,这也没有任何的问题,同样是能够实现反向迭代器的功能,但是这不是重点,我们实现这个思想时,多数会向下方代码那样,我以list举例,以这样的想法我们就会构建出这样的反向迭代器。

template<class T, class Ref, class Ptr>
struct __list_reverse_iterator
{typedef list_node<T> node;typedef __list_reverse_iterator<T, Ref, Ptr> self;node* _node;__list_reverse_iterator(node* n):_node(n){}Ref operator*(){return _node->_data;}Ptr operator->(){return &_node->_data;}self& operator++(){_node = _node->_prev;return *this;}self operator++(int){self tmp(*this);_node = _node->_prev;return tmp;}self& operator--(){_node = _node->_next;return *this;}self operator--(int){self tmp(*this);_node = _node->_next;return tmp;}bool operator!=(const self& s){return _node != s._node;}bool operator==(const self& s){return _node == s._node;}
};

        上述代码没有任何问题,博主也测试过能够实现反向迭代器的功能,但是呢看着这个代码是不是觉得很不爽啊,因为这反向迭代器通过这种另外封装一个类的方式,然后实现了一个与正向迭代器相互冗余的功能,这代码相似度太高了,写出来都觉得代码很挫,不好意思说出去是自己写的。

        基于此,请看看大佬是如何设计的吧。

         大佬干了啥,直接将正向迭代器作为反向迭代器的模板类型,在反向迭代器中重定义操作符,然后使用正向迭代器的功能,当然这个方式也是需要重新封装一个类,大伙还是看不出来有啥牛逼的,请继续往下看。

2 实现反向迭代器

代码:

template<class iterator, class Ref, class Ptr>
struct __list_reverse_iterator
{typedef __list_reverse_iterator<iterator, Ref, Ptr> Self;iterator _cur;__list_reverse_iterator(iterator it):_cur(it){}Ref operator*(){iterator temp = _cur;return *(--temp);}Self& operator++(){--_cur;return *this;}Self& operator--(){++_cur;return *this;}bool operator!=(const Self& ss){return _cur != ss._cur;}
};

        看到我们的代码,因为反向迭代器的类型是正向迭代器,所以我们需要在里面放置一个正向迭代器类型变量供使用。

        但是看到我们的反向迭代器构造了吗?我们对_cur变量赋初值等于iterator类型的it,但是it是怎么出来的?我们在使用反向迭代器的时候难道不是vv.rbegin();这种方式吗?我们有传递任何的数据吗?更何况还是一个正向迭代器类型的变量。

        此时就需要看到我们的rbegin函数了。

reverse_iterator rbegin()
{return reverse_iterator(end());
}
reverse_iterator rend()
{return reverse_iterator(begin());
}

        这样看可能不是很清楚,那我换一种方式表示:

reverse_iterator rbegin()
{
    return reverse_iterator(iterator(_head));
}

reverse_iterator rend()
{
    return reverse_iterator(iterator(_head->next));
}

        我们调用rbegin时,会实例化一个反向迭代器类,它通过正向迭代器去构造,正向迭代器通过结点指针构造。

        大家有注意到吗?这种实现方式的rbegin和rend指向我们数据的那个位置?和我们开头的思想相同吗?很明显不同,它的头指向了最后一个数据的下一个位置,它的尾指向了第一个位置,如下图。

         可是这样做的好处是什么?甚至我没有看到好处只看到了我之后*迭代器得到的数据都不对了,第一个数据都取不到了,但事实真的时是这样吗?回到代码中看:

Ref operator*()
{
     iterator temp = _cur;
     return *(--temp);
}

        我们在反向迭代器当中重定义*操作符函数下干了啥?我们创建了一个临时对象,将临时对象--在解引用,那么这样我们不就获取到了正确的数据了吗?所以这种构造思想没有错误。

        但是上面的道理大家都明白,好处在哪里?好了,重点到了!!

        看到上图,我们的begin对应的是rend,end对应的是rbegin,那么我们可以做一件什么事情呢?那就是反向迭代器类的参数传递可以通过正向迭代器的begin()、end()函数构建。也就是下方代码。

reverse_iterator rbegin()
{
    return reverse_iterator(end());
}
reverse_iterator rend()
{
    return reverse_iterator(begin());
}

         这也不是最重要的,最重要的是,我们将这份反向迭代器直接原封不动的放到vector当中,会有什么效果?你一定想不到,我们vector的反向迭代器也实现了!!

        如下:

namespace boqi
{template<class iterator, class Ref, class Ptr>struct __list_reverse_iterator{typedef __list_reverse_iterator<iterator, Ref, Ptr> Self;iterator _cur;__list_reverse_iterator(iterator it):_cur(it){}Ref operator*(){iterator temp = _cur;return *(--temp);}Self& operator++(){--_cur;return *this;}Self& operator--(){++_cur;return *this;}bool operator!=(const Self& ss){return _cur != ss._cur;}};template<class T>class vector{public://迭代器定义typedef T* iterator;typedef const T* const_iterator;typedef struct __list_reverse_iterator<iterator, T&, T*> reverse_iterator;typedef struct __list_reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;iterator begin(){return _start;}iterator end(){return _finish;}reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}private://三个迭代器表示一个开辟空间数组的3个位置iterator _start;iterator _finish;iterator _end_of_storage;};
}

        看到,博主甚至连名字都没有更换,再看它是否能用。

测试代码:

void test9()
{yf::vector<int> vv;vv.push_back(1);vv.push_back(2);vv.push_back(3);vv.push_back(4);yf::vector<int>::reverse_iterator rit = vv.rbegin();while (rit != vv.rend()){cout << *rit << " ";++rit;}cout << endl;
}

输出:

         看到了吗?我们的vector的反向迭代器直接就能用了,我们都知道vector和list的底层完全不同,通过大佬的这种方式实现,却将两个完全不同的迭代器完美的联系起来了,并且共用一份代码!而且不只是这两个容器可以用,任何由迭代器的容器都可以使用,因为只要你有迭代器,那一定支持++和--,而且它不关心你的正向迭代器是怎么实现的。对此我只能膜拜,大佬不愧是大佬。

3 完整代码

#pragma once#include<iostream>
#include<list>
#include<vector>
#include<algorithm>
#include<assert.h>namespace yf
{template<class T>struct node{//结点类在list创建时分配数据node(const T& val = T()):next(nullptr), prev(nullptr), data(val){}//前结点、后结点、T类型数据struct node<T>* next;struct node<T>* prev;T data;};//迭代器类//Ref和Ptr分别是T&,和T*,目的是为了不让代码冗余,const T&,const T*template<class T, class Ref, class Ptr>struct __list_iterator{typedef struct node<T> Node;typedef struct __list_iterator<T, Ref, Ptr> self;//浅拷贝传入过来的结点指针,不需要去开辟新空间//因为我们要的就是原本的结点struct __list_iterator(Node* node):Pos(node){}//*迭代器返回结点内部的数据Ref operator*(){return Pos->data;}//到下一个结点,而不是结点指针的下一个位置self& operator++(){Pos = Pos->next;return *this;}self operator++(int){self temp = *this;Pos = Pos->next;return temp;}self& operator--(){Pos = Pos->prev;return *this;}self operator--(int){self temp = *this;Pos = Pos->prev;return temp;}//返回节点数据的地址Ptr operator->(){//Pos已经是结点了,但是如果需要访问的数据也是一个结构体//那么获取到了它的地址,就能用->去访问了return &Pos->data;}bool operator==(const self& val){return Pos == val.Pos;}bool operator!=(const self& val){return Pos != val.Pos;}Node* Pos;};//反向迭代器template<class iterator, class Ref, class Ptr>struct __list_reverse_iterator{typedef __list_reverse_iterator<iterator, Ref, Ptr> Self;iterator _cur;__list_reverse_iterator(iterator it):_cur(it){}Ref operator*(){iterator temp = _cur;return *(--temp);}Self& operator++(){--_cur;return *this;}Self& operator--(){++_cur;return *this;}bool operator!=(const Self& ss){return _cur != ss._cur;}};//带头双向循环链表template<class T>class list{public:typedef struct node<T> Node;typedef struct __list_iterator<T, T&, T*> iterator;typedef struct __list_iterator<T,const T&, const T*> const_iterator;typedef struct __list_reverse_iterator<iterator, T&, T*> reverse_iterator;typedef struct __list_reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;iterator begin(){//进入迭代器类当中去,然后传入起始值的数据初始化return iterator(_head->next);}iterator end(){//_head相当于循环里的迭代器最后一个数据的下一个//所以初始化就用_head去初始化return iterator(_head);}const_iterator begin() const{return const_iterator(_head->next);}const_iterator end() const{return const_iterator(_head);}reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}const_reverse_iterator rbegin() const{return const_reverse_iterator(end());}const_reverse_iterator rend() const{return const_reverse_iterator(begin());}//构造时,有的对象是没有头结点的,所以需要帮忙开辟void Init_head(){_head = new Node;_head->next = _head;_head->prev = _head;}//无参list(){Init_head();}//拷贝list(const list<T>& val){Init_head();list<T> temp(val.begin(), val.end());std::swap(_head, temp._head);}//赋值重载list<T>& operator=(list<T> val) {std::swap(_head, val._head);return *this;}//迭代器区间构造template<class InputIterator>list(InputIterator first, InputIterator last){Init_head();while (first != last){push_back(*first);++first;}}//插入void insert(iterator pos, const T& val){Node* cur = pos.Pos;Node* NewNode = new Node(val);cur->prev->next = NewNode;NewNode->prev = cur->prev;NewNode->next = cur;cur->prev = NewNode;}//尾插void push_back(const T& val){iterator it = end();insert(it,val);}//头插void push_front(const T& val){iterator it = begin();insert(it,val);}	//删除void erase(iterator pos){assert(pos != end());Node* cur = pos.Pos;cur->prev->next = cur->next;cur->next->prev = cur->prev;delete cur;}//尾删void pop_back(){iterator it = end();erase(--it);}//头删void pop_front(){iterator it = begin();erase(it);}//判空bool empty(){return _head->next == _head;}//清空除头结点之外的所有结点void clear(){iterator it = begin();while (it != end()){erase(it++);}}//析构~list(){clear();delete _head;}private:Node* _head;};
}

        以上就是我对反向迭代器的全部理解,谢谢大家观看。

相关文章:

[C++]反向迭代器

目录 前言&#xff1a; 1 对反向迭代器的构造思想 2 实现反向迭代器 3 完整代码 前言&#xff1a; 本篇文章主要介绍了STL容器当中的反向迭代器&#xff0c;可能有朋友会说&#xff1a;“反向迭代器有什么好学的&#xff1f;不一样还是迭代器吗&#xff0c;我正向能写出来&…...

解析Python编程中的包结构

假设你想设计一个模块集&#xff08;也就是一个“包”&#xff09;来统一处理声音文件和声音数据。通常由它们的扩展有不同的声音格式&#xff0c;例如&#xff1a;WAV&#xff0c;AIFF&#xff0c;AU&#xff09;&#xff0c;所以你可能需要创建和维护一个不断增长的各种文件格…...

【前端】深入浅出缓存原理

缓存的基本原理 对于前端来说&#xff0c;缓存主要分为浏览器缓存&#xff08;比如 localStorage、sessionStorage、cookie等等&#xff09;以及http缓存&#xff0c;也是本文主要讲述的。 当然叫法也不一样&#xff0c;比如客户端缓存大概包括浏览器缓存和http缓存 所谓htt…...

单调栈图文详解(附Java模板)

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349;&#x1f95d; 啥是"单调栈"&#xff0c;它能解决什么样的问题&#xff1f; 文章目录&#x1f9a9;单调栈的概念&a…...

彻底理解Session、Cookie、Token,入门及实战

文章目录Session Cookie的使用Token的使用Session Cookie的使用 1. Session存储数据 HttpSession session request.getSession(); //Servlet底层通过的SESSIONID&#xff0c;获取Session对象。 session.setAttribute("loginTime",new Date()); out.println(&q…...

为什么运营商大数据可以精准获客?

“获客难”&#xff0c;“获客成本高”&#xff0c;一直是困扰企业的大问题&#xff0c;身边的许多朋友在吐槽客户的意向度不高&#xff0c;总是无法成交&#xff0c;员工非常积极主动去跟踪客户了&#xff0c;但始终事倍功半&#xff0c;这就像是老人们常说的一句老话“热脸贴…...

【数据结构】栈的实现

&#x1f4af;&#x1f4af;&#x1f4af; 本篇主要利用数组来实现栈&#xff0c;对于栈的各种操作都作详细介绍&#xff0c;压栈&#xff0c;出栈以及获取栈中元素的操作都是学习栈的必备知识&#xff0c;快来学起来吧&#xff01;&#xff01;&#xff01;©Ⅰ.栈的概念及…...

【链表OJ题(六)】链表分割

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录链表OJ题(六)1. 链表…...

C++类中的三大函数(构造,析构,拷贝)

下面一段话与大家共勉&#xff1a;每个人的一生都会遇到很多边界&#xff0c;有些边界可以突破&#xff0c;有些则不能。那些无法突破的边界就是你的极限&#xff0c;而划分边界的标准就是“阈值”。每次突破阈值之后&#xff0c;人生轨迹就会发生剧烈变化&#xff0c;其间需要…...

【2024考研】计算机考研,4轮复习时间安排

文章目录&#x1f3a8;第1轮复习&#xff08;暑假前&系统课&#xff09;英语1/2数学1/2专业课408&#x1f3a8;第2轮复习&#xff08;开学前&真题&#xff09;英语1/2试卷数学1/2试卷专业课408试卷&#x1f3a8;第3轮复习&#xff08;报名前&政治&#xff09;政治试…...

(十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据

系列文章: python网络爬虫专栏 目录 序言 本节学习目标 特别申明 4.7 使用BeautfulSoup解析h...

【经验】项目管理:瀑布式、Scrum

1、瀑布式开发 流程关键词关键人员输出立项简述、周期、预算领导立项申请表、立项评审表策划计划项目经理、QA、CM各种计划书&#xff08;项目、配置、测试等&#xff09;&#xff0c;评审需求功能项目经理功能列表、需求规格书、需求开发计划等&#xff0c;评审设计UML开发设…...

Learning C++ No.17【STL No.7】双端队列

引言&#xff1a; 北京时间&#xff1a;2023/3/17/7:18&#xff0c;刚刚快乐的早锻炼回来&#xff08;不对 &#xff0c;应该说回来有一会了&#xff09;&#xff0c;因为此时我已经吃完早饭&#xff0c;洗过澡了&#xff1b;现在回想起上学期&#xff0c;就算是第二天需要晨跑…...

Snackbar

1.简介 位于底部的提示View 支持侧滑消失 同一时间只有一个 不支持跨Activity展示 国内使用率很低 2.基础使用 2.1 基本展示 Snackbar.make(view, "Content", Snackbar.LENGTH_LONG).show()2.2 设置点击事件 注意不设置点击事件回调&#xff0c;点击按钮的文字不…...

HummerRisk 使用教程:主机检测

1. 概述 HummerRisk 是开源的云原生安全平台&#xff0c;以非侵入的方式解决云原生环境的安全和治理问题。核心能力包括混合云的安全治理和容器云安全检测。 本文将介绍HummerRisk中的主机检测部分功能&#xff0c;包括如何管理主机、管理凭证&#xff0c;以及使用主机检测规…...

【Arduino无线气象站项目】

【Arduino无线气象站项目】 1. 概述2. Arduino无线气象站电路图3. 定制设计电路板4. Arduino无线气象站代码5. 总结1. 概述 使用DHT22传感器测量室外温度和湿度,并使用NRF24L01收发器模块将这些数据无线发送到室内机。在室内机,还有另一个用于测量室内温度和湿度的DHT22传感…...

HTTP详解

一&#xff0c;什么是HTTPHTTP(全称为“超文本传输协议”)&#xff0c;是一种应用非常广泛的应用层协议&#xff0c;之前在《初识网络原理》的博客(初识网络原理_徐憨憨&#xff01;的博客-CSDN博客)中&#xff0c;有详细讲解过TCP/IP五层模型&#xff0c;其中应用层描述了数据…...

cpufreq--处理器功耗控制

cpu 功耗控制 参考框架&#xff1a; cpufreq 框架。 cpufreq 框架提供 cpu 功耗管理接口&#xff0c;以及功耗管理方案。 用户可以通过功耗管理接口&#xff08;以文件形式提供&#xff09;来选择管理方案&#xff0c;并设置相关参数。 管理方案的实现则由具体的驱动来完成。…...

做技术,最忌讳东张西望

又好长时间没更新&#xff0c;研二了&#xff0c;忙着做实验、写论文、发论文&#xff0c;再加上给我导做一些事情&#xff08;都习惯了&#xff0c;以前很不爽的事情&#xff0c;现在居然能这么平静的说出来&#xff09;。 但这不是我今天说的重点&#xff0c;而是另外一件事…...

Oracle 常见报错问题汇总

Oracle 常见报错问题汇总 报错:ORA-01017: invalid username/password; logon denied报错:ORA-01031: insufficient privileges报错:"ORA-01034: ORACLE not available" 和 "ORA-27101: shared memory realm does not exist"报错:“ORA-00119: invalid…...

单片机连接有人云上传数据

首先采用有人物联网的模块 &#xff0c;连接有人云平台服务器 看云平台相关配置配置连接设备在线后 添加设备添加设备完成后 添加变量模板 变量模板的添加方式如下 &#xff1a;本次采用的是标准的MODbus 协议添加一个温度变量温度变量如下显示云平台 下发数据 采集01 03 00 00…...

系统集成项目管理工程师:第18章项目风险管理学习笔记

第18章项目风险管理 一、目录 18.1 风险概述 18.1.1 风险的定义 18.1.2 风险的分类 18.1.3 风险的性质 18.2 项目风险管理 18.3 规划风险管理 18.3.1 规划风险管理的输入 18.3.2 规划风险管理的工具与技术 18.3.3 规划风险管理的输出 18.4 识别风险...

【笔试强训选择题】Day3.习题(错题)解析

文章目录 前言一、Day3习题&#xff08;错题&#xff09;解析二、Day3习题&#xff08;原题&#xff09;练习总结前言 今天我们将进入到第三天的练习&#xff0c;希望能一直坚持下去&#xff0c;不断反思总结错误&#xff0c;得到进步&#xff1b; 一、Day3习题&#xff08;错…...

基于GPT-4的免费代码生成工具

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

Android开发的这一年里,Jetpack的Room源码是怎么狠狠奖励我的?

简述 Android Jetpack的出现统一了Android开发生态&#xff0c;各种三方库逐渐被官方组件所取代。Room也同样如此&#xff0c;逐渐取代竞品成为最主流的数据库ORM框架。这当然不仅仅因为其官方身份&#xff0c;更是因为其良好的开发体验&#xff0c;大大降低了SQLite的使用门槛…...

推荐一款卸载软件的小工具-《UninstallToo》

目录 UninstallToo介绍 UninstallToo下载 UninstallToo使用 总结 UninstallToo介绍 Uninstall Tool 是一款可以用来替代“添加/删除程序”的工具。它允许您显示隐藏的安装程序&#xff0c;按名称过滤已安装程序的列表&#xff0c;强行写在程序&#xff0c;浏览注册表项目&a…...

线程池——JUC随记8

线程池使用方式 1、一池N线程&#xff08;Executors.newFixedThreadPool(n)&#xff09; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class ExecutorDemo {public static void main(String[] args) {ExecutorService execu…...

SpringCloudAlibaba微服务调用组件-Feign

SpringCloudAlibaba微服务调用组件-Feign 本项目代码与笔记已存放在Gitee仓库 地址&#xff1a; 代码&#xff0c;笔记 文章目录SpringCloudAlibaba微服务调用组件-Feign1. 什么是Feign1.1 优势2. Spring Cloud Alibaba快速整合OpenFeign1&#xff09;引入依赖2&#xff09;编写…...

高效学习方法论

2023.03.17 《程序员的三门课&#xff1a;技术精进、架构修炼、管理探秘 / 于君泽等著》学习笔记 学会学习一、高效学习的方法1、管理好自己的目标1&#xff09;评估能力2&#xff09;制定目标3&#xff09;评估目标2、利用好碎片时间3、在同一时间只做一件事二、高效学习的途径…...

C语言结构体(一篇学会)

C语言结构体 在C语言中&#xff0c;结构体是一种自定义的数据类型&#xff0c;它允许用户将不同类型的数据组合在一起。结构体由多个变量组成&#xff0c;这些变量称为结构体的成员。结构体成员可以是不同的数据类型&#xff0c;如整数、浮点数、字符或其他结构体等。 结构体…...

贵州城乡建设部网站/seo兼职外包

MATLAB 下的数字信号处理实现示例 附录一 信号、系统和系统响应 1、理想采样信号序列 ( 1)首先产生信号 x(n),0<n<50 n0:50; %定义序列的长度是 50 A444.128; %设置信号有关的参数 a50*sqrt(2.0)*pi; T0.001; %采样率 w050*sqrt(2.0)*pi; xA*exp(-a*n*T).*sin(w0*n*T); %…...

百度bae安装wordpress教程/seo关键词排名软件流量词

共有2种方法 强制转化&#xff1a; 自己的类 name &#xff08;自己的类&#xff09;object对象根据类型转化&#xff1a; if&#xff08;Object instance of 自己的类 &#xff09; { 转化 } 安全考虑 先判断再转换比较安全 if (obj instanceof xxx) {xxx o (xxx)obj;…...

广州互联网公司排名前20/seo问答

描述 欢迎来到猫咪系列题目之猫咪银行。 这也是猫咪占领世界的计划之一&#xff0c;通过开设猫咪银行出售 flag 来学习人类割韭菜的技巧。 通过理财一般来说都得不到&#xff0c;找漏洞 涉及购买、货币的一般先考虑溢出 找溢出点 可以修改的 value 有买入分钟和买入份额 挨…...

迈创网站建设/友链交换

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。以照片为例&#xff0c;16&#xff1a;9尺寸的照片是指长边与短边之比是16&#xff1a;9&#xff0c;与照片像素的多与少没有关系&#xff0c;例如可以是长边是160像素、短边是90像素…...

广州专门做网站的公司/推广计划书范文

求职 地图 网页 应用 更多 关键词&#xff1a;C/C面试技巧及试题&#xff1f; C/C 试题有难有易&#xff0c;不能因为容易&#xff0c;我们就轻视&#xff0c;更不能因为难&#xff0c;我们就放弃。我们面对高薪就业的态度永远不变&#xff0c;那就是坚持、坚持、再坚持。出现问…...

南京有哪些做网站的公司/360网站排名优化

问题 MediaConvert进行转码任务的时候&#xff0c;需要及时了解MediaConvert转码任务的状态。因为AWS设计成MediaConvert转码任务只能给AWS的服务监控平台CloudWatch发事件&#xff0c;这次就来说说怎么在CloudWatch上面配置对MediaConvert转码任务的监听。 步骤 MediaConve…...