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

招商加盟网站大全汇总海南中小企业网站建设

招商加盟网站大全汇总,海南中小企业网站建设,杨浦苏州网站建设,北京市朝阳区网站制作朋友们、伙计们#xff0c;我们又见面了#xff0c;本期来给大家解读一下有关反向迭代器的模拟实现#xff0c;如果看完之后对你有一定的启发#xff0c;那么请留下你的三连#xff0c;祝大家心想事成#xff01; C 语 言 专 栏#xff1a;C语言#xff1a;从入门到精通… 朋友们、伙计们我们又见面了本期来给大家解读一下有关反向迭代器的模拟实现如果看完之后对你有一定的启发那么请留下你的三连祝大家心想事成 C 语 言 专 栏C语言从入门到精通 数据结构专栏数据结构 个  人  主  页 stackY、 C 专 栏   C Linux 专 栏  Linux ​ 目录 前言 1. 基本构造 2. 接口完善 3. 在list中使用反向迭代器 list反向迭代器版本一 list反向迭代器版本二  4. 在vector中使用反向迭代器  前言 前面的模拟实现vector和list中是没有实现反向迭代器的反向迭代器与正向迭代器相比就是从数据的末端向前面访问遍历但是两个迭代器的用法都是一样的就是下一个*就可以访问到数据但是它具体是怎么实现的呢我们接下来看一看 1. 基本构造 在list的模拟实现中讲解了如何实现正向迭代器包含const版本和非const版本那么在本期实现反向迭代器的时候就有了一定的前车之鉴比如const版本和非const版本不需要实现两份代码可以采用模板实现泛型编程。 反向迭代器的构造可以使用正向迭代器来进行复用因为反向迭代器的就是正向迭代器里面的--所以在传递模板参数的时候可以直接传递一个迭代器直接复用这个迭代器里面的各种结构完成反向迭代器的构造。这种方式叫做迭代器适配器。 #pragma oncenamespace ywh {//反向迭代器template class Iterator, class Ref, class Ptrclass ReverseIterator{public:typedef ReverseIteratorIterator, Ref, Ptr Self;//构造ReverseIterator(Iterator it):_it(it){}private:Iterator _it;}; }2. 接口完善 反向迭代器的接口有、--、*、-、!、这些接口的实现都是可以通过使用模板参数中的迭代器来进行复用即可。 头文件 reverse_iterator.h #pragma oncenamespace ywh {//反向迭代器template class Iterator, class Ref, class Ptrclass ReverseIterator{public:typedef ReverseIteratorIterator, Ref, Ptr Self;//构造ReverseIterator(Iterator it):_it(it){}//前置//operatorSelf operator(){//复用传过来的迭代器里面的operator----_it;return *this;}//operator--Selfoperator(){_it;return *this;}//operator*Ref operator*(){return *_it;}//operator-Ptr operator-(){return _it.operator-();}//operatorbool operator(const Self s){return _it s._it;}//operator!bool operator!(const Self s){return _it ! s._it;}private:Iterator _it;}; }3. 在list中使用反向迭代器 要使用反向迭代器首先得在list头文件中包含以下反向迭代器的头文件然后进行构造 list反向迭代器版本一 #pragma once #include reverse_iterator.h namespace ywh {//链表结构templateclass Tstruct list_node{T _data; //节点中的数据list_nodeT* _prev; //指向前一个节点的指针list_nodeT* _next; //指向后一个节点的指针//构造list_node(const T x T()):_data(x), _prev(nullptr), _next(nullptr){}};//正向迭代器// 类型模板参数 传递引用 传递指针templateclass T, class Ref, class Ptrstruct __list_iterator{typedef list_nodeT Node;typedef __list_iteratorT, Ref, Ptr self;Node* _node;//迭代器构造__list_iterator(Node* node):_node(node){}//前置//operatorself operator(){_node _node-_next;return *this;}//operator--self operator--(){_node _node-_prev;return *this;}//后置self operator(int){self* tmp(_node);_node _node-_next;return tmp;}//operator--self operator--(int){self* tmp(_node);_node _node-_prev;return tmp;}//operator*Ref operator*(){return _node-_data;}//operator-Ptr operator-(){return _node-_data;}//operator!bool operator!(const self s){return _node ! s._node;}//operatorbool operator(const self s){return _node s._node;}};//list结构templateclass Tclass list{public:typedef list_nodeT Node;typedef __list_iteratorT, T, T* iterator; //非const迭代器typedef __list_iteratorT, const T, const T* const_iterator; //const迭代器typedef ReverseIteratoriterator, T, T* reverse_iterator; //反向迭代器typedef ReverseIteratorconst_iterator, const T, const T* const_reverse_iterator; //反向迭代器public:基本构造/////...///正向迭代器iterator begin(){return iterator(_head-_next); //使用匿名对象进行构造}iterator end(){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(end());}const_reverse_iterator rbegin() const{return const_reverse_iterator(--end());}const_reverse_iterator rend() const{return const_reverse_iterator(end());}///修改相关接口//...private:Node* _head; //链表的头节点size_t _size; //节点个数}; } list反向迭代器版本二  我们也可以看一下库里面list的反向迭代器如何设计 可以看到库里面的玩法是一种对称的结构这种对称的结构在解引用访问时访问的是下一个节点的元素这样子写是比较好理解的正向的起始就是反向的结束正向的结束就是反向的起始那么我们也可以来按照这种写法来写一下 头文件reverse_iterator.h #pragma once namespace ywh {//反向迭代器template class Iterator, class Ref, class Ptrclass ReverseIterator{public:typedef ReverseIteratorIterator, Ref, Ptr Self;//构造ReverseIterator(Iterator it):_it(it){}//前置//operatorSelf operator(){//复用传过来的迭代器里面的operator----_it;return *this;}//operator--Selfoperator(){_it;return *this;}//operator*Ref operator*(){Iterator cur _it;//返回下一个节点的数据return *(--cur);}//operator-Ptr operator-(){return _it.operator-();}//operatorbool operator(const Self s){return _it s._it;}//operator!bool operator!(const Self s){return _it ! s._it;}private:Iterator _it;}; }头文件List.h #pragma once #include reverse_iterator.h namespace ywh {//链表结构templateclass Tstruct list_node{T _data; //节点中的数据list_nodeT* _prev; //指向前一个节点的指针list_nodeT* _next; //指向后一个节点的指针//构造list_node(const T x T()):_data(x), _prev(nullptr), _next(nullptr){}};//正向迭代器// 类型模板参数 传递引用 传递指针templateclass T, class Ref, class Ptrstruct __list_iterator{typedef list_nodeT Node;typedef __list_iteratorT, Ref, Ptr self;Node* _node;//迭代器构造__list_iterator(Node* node):_node(node){}//前置//operatorself operator(){_node _node-_next;return *this;}//operator--self operator--(){_node _node-_prev;return *this;}//后置self operator(int){self* tmp(_node);_node _node-_next;return tmp;}//operator--self operator--(int){self* tmp(_node);_node _node-_prev;return tmp;}//operator*Ref operator*(){return _node-_data;}//operator-Ptr operator-(){return _node-_data;}//operator!bool operator!(const self s){return _node ! s._node;}//operatorbool operator(const self s){return _node s._node;}};//list结构templateclass Tclass list{public:typedef list_nodeT Node;typedef __list_iteratorT, T, T* iterator; //非const迭代器typedef __list_iteratorT, const T, const T* const_iterator; //const迭代器typedef ReverseIteratoriterator, T, T* reverse_iterator; //反向迭代器typedef ReverseIteratorconst_iterator, const T, const T* const_reverse_iterator; //反向迭代器public:基本构造/////...///正向迭代器iterator begin(){return iterator(_head-_next); //使用匿名对象进行构造}iterator end(){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());}///修改相关接口//...private:Node* _head; //链表的头节点size_t _size; //节点个数}; } 4. 在vector中使用反向迭代器  vector中的反向迭代器不建议使用上面的版本一因为begin()和end()是传值返回是临时对象而临时对象具有常性不好进行修改所以还是比较建议使用这种对称的结构。 头文件Vector.h #pragma once #include assert.h #include reverse_iterator.h namespace ywh {templateclass Tclass vector{public:typedef T* iterator;typedef const T* const_iterator;typedef ReverseIteratoriterator, T, T* reverse_iterator;typedef ReverseIteratorconst_iterator, const T, const T* const_reverse_iterator;public:/正向迭代器iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}/反向迭代器/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());}/基本构造/////...///容量//...///修改//...private:iterator _start nullptr; //起始位置iterator _finish nullptr; //有效数据位置iterator _end_of_storage nullptr; //结束位置}; } 朋友们、伙计们美好的时光总是短暂的我们本期的的分享就到此结束欲知后事如何请听下回分解~最后看完别忘了留下你们弥足珍贵的三连喔感谢大家的支持
http://www.yutouwan.com/news/21361/

相关文章:

  • 网站首页设计有限公司长沙有名的公司
  • 容桂网站制作动态中海建路桥建设有限公司网站
  • 菜谱网站后台代码化工企业建网站
  • 企业网站流量预估旅游网站建设初衷
  • 坪山区住房和建设局网站哈尔滨专业网站建设哪个好
  • 网站优化意义绵阳高端网站建设
  • 快速微信网站开发医院网站建设情况汇报
  • 宣城哪里做网站网站建设费税率
  • 适用于手机的网站怎么建设手机app可以做网站吗
  • 高端旅游网站制作沈阳网络优化公司哪家好
  • 我的世界做壁纸的网站dw表格怎么做网站搜索
  • 国内做的比较好的网站是什么苏州化妆品网站建设
  • 重庆设计网站网易企业邮箱app下载
  • 网站备案 子域名国外知名平面设计网站
  • 网站开发成本主要有哪些长沙移动网站
  • 云南省中国建设工程造价管理协会网站做网站职业咋样
  • 网站建设银行业务预约纪念币猪年纪念币预约做网站开发的有外快嘛
  • 广告网站有哪些7电脑不能打开wordpress
  • 上海手机网站建设多少钱北京装饰公司一览表
  • 国外网站怎么做推广怎么建网站青州问枫
  • 百度小程序还需要做网站吗网络营销的特点不包括
  • 上海浦东新区做网站个人可以建设头条网站吗
  • 网站建设的流程和内容网页版游戏排行榜2022
  • 蚌山网站建设杭州做网站比较出名的公司有哪些
  • 晋中路桥建设集团有限公司网站高密建网站
  • 北京市网站建设公司排名最新网站发布
  • 宜宾网站开发公司wordpress 08影院
  • 2015做哪些网站致富付网站建设费会计分录
  • 单页做网站教程手机排行榜2022前十名
  • 怎么给自己的网站做扫描码什么公司做的网站好