反向迭代器与正向迭代器的关系:
STL源码中如下:
正向和反向迭代器的begin()和end()相反,是对称的,这种关系使得反向迭代器解引用时,我们应该往前倒一下,再解引用。
模板使用
因为需要用正向迭代器来适配,此外还要考虑==const类型反向迭代器(因为像重载解引用函数和重载->不能构成函数重载,因为这里不传参,只是返回值类型不同)。==所以参数为:正向迭代器、引用、指针。
成员变量:
显然,它需要一个正向迭代器作为成员变量,我们的构造函数就以正向迭代器来初始反向迭代器。做成员变量的赋值即可。
operator*()
我们要的是解引用当前迭代器,应该返回引用,因为需要有修改值本身的权限,且正向迭代器返回重载*返回的也是引用,所以这里继续用引用Ref,此外。此外,因为和正向迭代器相反,解引用应该给前面倒一个。
Ref operator*()
{Iterator tmp = _it;return *(--tmp);
}
Ptr operator->()
{return &(operator*());
}
Self& operator++()
{--_it;return *this;
}
Self& operator--()
{++_it;return *this;
}
#pragma once
#include
using namespace std;// 在别的文件中也可以起同名的命名空间,且在别的文件中兼容
namespace lz
{// 适配器 -- 复用 :在声明处给的iterator 比如list那里的iterator/* 在list中 有如下的情况 // 反向迭代器也分普通和cosnt类型typedef ListIterator riterator;typedef ListIterator const_riterator;*/templatestruct Reverse_iterator{Iterator _it; // 正向迭代器类 typedef Reverse_iterator Self;Reverse_iterator(Iterator it):_it(it){}// 使用模板还是为了区分const和普通类型迭代器,因为无参 所以不能通过传参构成重载// 因为返回的是解引用,正向迭代器解引用返回的是&类型,所以这里引用接可以 且就是要修改,得引用,且这里是迭代器Ref operator*(){Iterator tmp = _it;return *(--tmp);}Ptr operator->(){return &(operator*());}// Self:因为++、--运算要返回迭代器对象// 引用:因为需要要对存的值有修改权限 且是*this,它配// 返回迭代器对象 反向的++,需要对正向--,再解引用Self& operator++(){--_it;return *this;}Self& operator--(){++_it;return *this;}bool operator!=(const Self& s){return _it != s._it;}};
}
public:// 两个的作用typedef ListIterator iterator;typedef ListIterator const_iterator;// 反向迭代器也分普通和cosnt类型typedef Reverse_iterator riterator;typedef Reverse_iterator const_riterator;
==下面是begin和end==
iterator begin(){return iterator(_pHead->_pNext);}// list的end()其实是头节点,这里不存值。// 不用引用,因为返回的是临时变量。不是类成员变量,只有类成员变量,才有资格。如:*this等iterator end(){return iterator(_pHead);}
// ===== 反向迭代器:普通和const可以重载,因为参数后面加了const,符合重载条件 =======riterator rbegin(){return riterator(end());}riterator rend(){return riterator(begin());}
下一篇:Activity