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

网站建设贵阳个人网站免费模板下载

网站建设贵阳,个人网站免费模板下载,网店代运营收费多少钱,网站首页没有收录反向迭代器的模拟实现 一、反向迭代器的定义二、反向迭代器的功能2.1 operator2.2 operator- -2.3 operator*2.4 operator#xff01; 三、list反向迭代器模拟实现完整代码3.1 list.h3.2 iterator.h3.3 test.cpp 一、反向迭代器的定义 我们反向迭代器的思路是复用正向迭代器的… 反向迭代器的模拟实现 一、反向迭代器的定义二、反向迭代器的功能2.1 operator2.2 operator- -2.3 operator*2.4 operator 三、list反向迭代器模拟实现完整代码3.1 list.h3.2 iterator.h3.3 test.cpp 一、反向迭代器的定义 我们反向迭代器的思路是复用正向迭代器的功能使用一个正向迭代器来创建一个反向迭代器如果是vector的正向迭代器创建的就是vector的反向迭代器如果是list的正向迭代器创建的就是list的反向迭代器。   我们之前实现普通迭代器是声明了一个迭代器类。此时我们也要定义一个反向迭代器类。而这个反向迭代器是由正向迭代器构造而来的。 templateclass Iterator,class Ref,class Ptr struct ReverseIterator {typedef ReverseIteratorIterator,Ref,Ptr Self;Iterator _cur;ReverseIterator(Iterator it):_cur(it){} };在list类中我们要重命名一个反向迭代器并将其调用接口写好。其中关于模板参数的书写我们要注意一下。   第一个模板参数是普通迭代器类型。   第二个是迭代器其指向其数据的数据类型的引用。   第三个是迭代器其指向其数据的数据类型的指针。 并在此基础上定义好const_iterator typedef __list_iteratorT,T,T* iterator; typedef __list_iteratorT,const T,const T* const_iterator;typedef ReverseIterator iterator, T, T* reverse_iterator; typedef ReverseIterator iterator, const T, const T* const_reverse_iterator;这样的好处是调用普通的rbegin()则创建普通的反向迭代器其中operator*的返回值是可修改的。   而const成员调用的是const类型rbegin()则创建了const_iterator。   以下是list中通过普通迭代器构造出反向迭代器的rbegin()、rend()。 reverse_iterator rbegin() {return reverse_iterator(end()); }reverse_iterator rend() {return reverse_iterator(begin()); }二、反向迭代器的功能 2.1 operator Self operator() {--_cur;return *this; }Self operator(int) {Self tmp(_cur);--_cur;return tmp; } 2.2 operator- - Self operator--() {_cur;return *this; }Self operator--(int) {Self tmp(_cur);_cur;return tmp; }2.3 operator* 这里先明确一点在STL中反向迭代器的rbegin()是由list的end()构造的也就是_head结点。所以我们在解引用的时候其实是返回其前一个位置的数据。这样做的好处是为了做到迭代器指向的对称。 Ref operator*() {Iterator tmp _cur;--tmp;return *tmp; }2.4 operator bool operator!(const Self s) {return _cur ! s._cur; }三、list反向迭代器模拟实现完整代码 3.1 list.h #pragma once #includeassert.h #includeIterator.hnamespace zl {templateclass Tstruct list_node{list_nodeT* _next;list_nodeT* _prev;T _data;list_node(const T xT()):_next(nullptr),_prev(nullptr),_data(x){}};//1、迭代器要么就是原生指针//2、迭代器要么就是自定义类型对原生指针的封装模拟指针的行为templateclass T,class Ref,class Ptrstruct __list_iterator{typedef list_nodeT node;typedef __list_iteratorT,Ref,Ptr self;node* _node;__list_iterator(node* n):_node(n){}Ref operator*(){return _node-_data;}Ptr operator-() //it-_a1 it--_a1 本来应该是两个-但是为了增强可读性省略了一个-{return _node-_data;}self operator(){_node _node-_next;return *this;}self operator(int){self tmp(*this);_node _node-_next;return tmp;}self operator--(){_node _node-_prev;return *this;}self operator--(int){self tmp(*this);_node _node-_prev;return tmp;}bool operator!(const self s){return _node ! s._node;}bool operator(const self s){return _node s._node;}};//templateclass T, class Ref, class Ptr//struct __list_reverse_iterator//{// typedef list_nodeT node;// typedef __list_reverse_iteratorT, Ref, Ptr self;// node* _node;// __list_reverse_iterator(node* n)// :_node(n)// {}// Ref operator*()// {// return _node-_data;// }// Ptr operator-() //it-_a1 it--_a1 本来应该是两个-但是为了增强可读性省略了一个-// {// 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;// }//};/*templateclass Tstruct __list_const_iterator{typedef list_nodeT node;typedef __list_const_iteratorT self;node* _node;__list_const_iterator(node* n):_node(n){}const T operator*(){return _node-_data;}self operator(){_node _node-_next;return *this;}self operator(int){self tmp(*this);_node _node-_next;return tmp;}self operator--(){_node _node-_prev;return *this;}self operator--(int){self tmp(*this);_node _node-_prev;return tmp;}bool operator!(const self s){return _node ! s._node;}bool operator(const self s){return _node s._node;}};*/templateclass Tclass list{typedef list_nodeT node;public:typedef __list_iteratorT,T,T* iterator;typedef __list_iteratorT,const T,const T* const_iterator;//typedef __list_reverse_iteratorT, T, T* reverse_iterator;typedef ReverseIterator iterator, T, T* reverse_iterator;typedef ReverseIterator iterator, const T, const T* const_reverse_iterator;//typedef __list_const_iteratorT const_iterator;/*reverse_iterator rbegin(){return reverse_iterator(_head-_prev);}reverse_iterator rend(){return reverse_iterator(_head);}*/reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}iterator begin(){//iterator it(_head-_next);//return it;return iterator(_head-_next);}const_iterator begin() const{//iterator it(_head-_next);//return it;return const_iterator(_head-_next);}iterator end(){//iterator it(_head);//return it;return iterator(_head);}const_iterator end() const{//iterator it(_head);//return it;return const_iterator(_head);}void empty_init(){_head new node;_head-_next _head;_head-_prev _head;}list(){/*_head new node;_head-_next _head;_head-_prev _head;*/empty_init();}template class Iteratorlist(Iterator first, Iterator last){empty_init();while (first ! last){push_back(*first);first;}}//lt2(lt1) 拷贝构造传统写法/*list(const listT lt){empty_init();for (auto e : lt){push_back(e);}}*/void swap(listT tmp){std::swap(_head, tmp._head);}//现代写法list(const listT lt){empty_init();listT tmp(lt.begin(), lt.end());swap(tmp);}//lt1lt3listT operator(listT lt){swap(lt);return *this;}~list(){clear();delete _head;_head nullptr;}void clear(){iterator it begin();while (it ! end()){//it erase(it);erase(it);}}void push_back(const T xT()){/*node* tail _head-_prev;node* new_node new node(x);tail-_next new_node;new_node-_prev tail;new_node-_next _head;_head-_prev new_node;*/insert(end(), x);}void push_front(const T x T()){insert(begin(), x);}void pop_back(){erase(--end());}void pop_front(){erase(begin());}void insert(iterator pos, const T x){node* cur pos._node;node* prev cur-_prev;node* new_node new node(x);prev-_next new_node;new_node-_prev prev;new_node-_next cur;cur-_prev new_node;}iterator erase(iterator pos){assert(pos ! end());node* prev pos._node-_prev;node* next pos._node-_next;prev-_next next;next-_prev prev;delete pos._node;return iterator(next);}private:node* _head;};void print_list(const listint lt){listint::const_iterator it lt.begin();while (it ! lt.end()){//(*it) * 2;cout *it ;it;}cout endl;}void test_list1(){listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);listint::iterator it lt.begin();while (it ! lt.end()){cout *it ;it;}cout endl;for (auto e : lt){cout e ;}cout endl;print_list(lt);}struct AA{int _a1;int _a2;AA(int a10,int a20):_a1(a1),_a2(a2){}};void test_list2(){listAA lt;lt.push_back(AA(1, 1));lt.push_back(AA(2, 2));lt.push_back(AA(3, 3));//AA* ptrlistAA::iterator it lt.begin();while (it ! lt.end()){//cout (*it)._a1 (*it)._a2 endl;cout it-_a1 it-_a2 endl;//cout it.operator-()-_a1 : it.operator-()-_a1 endl;it;}cout endl;}void test_list3(){listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto e : lt){cout e ;}cout endl;auto pos lt.begin();pos;lt.insert(pos, 20);for (auto e : lt){cout e ;}cout endl;lt.push_back(100);lt.push_front(1000);for (auto e : lt){cout e ;}cout endl;lt.pop_back();lt.pop_front();for (auto e : lt){cout e ;}cout endl;}void test_list4(){listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto e : lt){cout e ;}cout endl;lt.clear();for (auto e : lt){cout e ;}cout endl;lt.push_back(10);lt.push_back(20);lt.push_back(30);lt.push_back(40);for (auto e : lt){cout e ;}cout endl;}void test_list5(){listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto e : lt){cout e ;}cout endl;listint lt2(lt);for (auto e : lt2){cout e ;}cout endl;listint lt3;lt3.push_back(10);lt3.push_back(20);lt3.push_back(30);lt3.push_back(40);lt3.push_back(50);for (auto e : lt3){cout e ;}cout endl;lt lt3;for (auto e : lt){cout e ;}cout endl;}void test_list6(){listint lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);listint::iterator it lt.begin();while (it ! lt.end()){cout *it ;it;}cout endl;listint::reverse_iterator rit lt.rbegin();while (rit ! lt.rend()){cout *rit ;rit;}cout endl;}}3.2 iterator.h #pragma oncenamespace zl {//vector::iterator//list::iterator//deque::iteratortemplateclass Iterator,class Ref,class Ptrstruct ReverseIterator{typedef ReverseIteratorIterator,Ref,Ptr Self;Iterator _cur;ReverseIterator(Iterator it):_cur(it){}Ref operator*(){Iterator tmp _cur;--tmp;return *tmp;}Self operator(){--_cur;return *this;}Self operator--(){_cur;return *this;}bool operator!(const Self s){return _cur ! s._cur;}}; }3.3 test.cpp #define _CRT_SECURE_NO_WARNINGS 1 #includeiostream #includevector #includelist #include functional #includealgorithm #includestring using namespace std; #include list.h #includeIterator.h #includevector.hint main() {//zl::test_list1();//zl::test_list2();//zl::test_list3();//zl::test_list4();//zl::test_list5();zl::test_list6();//zl::test_vector8();//std::vectorint::iterator it;//cout typeid(it).name() endl;return 0; }
http://www.huolong8.cn/news/324063/

相关文章:

  • 网站的建设费用预算工信部网站icp备案查询
  • 贵州省网站备案企业网站做静态网站还是
  • 新网站必须做301定向吗高仿微博wordpress
  • 网盘视频直接做网站在东莞做网站
  • 重庆网站设计哪家好少儿培训
  • 企业网站建设有几种青岛手机建站多少钱
  • 自己做的网站能赚钱吗国内知名展示设计公司
  • 网站开发计入会计 什么科目营销型网站如何策划
  • 东营网站设计公司建筑门户网站
  • 网站的在线支付模块怎么做企业所得税优惠政策2020
  • 坪山网站建设行情做网站除了域名还要买什么
  • 免费资料网站网址下载视频网站开发php
  • 什么是网站建设技术react 网站开发
  • 校园淘宝店网站开发百度灰色关键词代发
  • 深圳外贸建站网络推广公司做爰全程的网站
  • 如何做网站连接手机app ui设计
  • 免费建立网站教程php作品源代码免费下载
  • 如何做网站的营销高端网页制作公司
  • 美仑-专门做服装的网站餐饮网站开发
  • 做网站的手机软件济南企业网站搭建
  • 专业做网站+上海建设制作网站
  • 做网站公司 备案在线做头像网站
  • 常德营销型网站建设小白如何建网站
  • 图片网站如何优化wordpress导入模板之后
  • 男女怎样做那个视频网站黄岗住房和城乡建设厅官方网站
  • 海口网站建设哪个好薇郑州企业网络推广
  • 渭南市住建设局网站司法局网站开发方案
  • 网站免费建站厂商定制深圳企业网站制作公司查询
  • 五金公司网站模板门户网站是指提供什么的网站
  • wordpress做企业展示站动漫设计就业率高吗