电子商务网站建设 市场分析,广州有哪些做网站专业的公司,上海松一网站建设,济源网站优化反向迭代器的模拟实现 一、反向迭代器的定义二、反向迭代器的功能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;
}