赞
踩
反向迭代器与正向迭代器的关系:
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<iostream> using namespace std; // 在别的文件中也可以起同名的命名空间,且在别的文件中兼容 namespace lz { // 适配器 -- 复用 :在声明处给的iterator 比如list那里的iterator /* 在list中 有如下的情况 // 反向迭代器也分普通和cosnt类型 typedef ListIterator<iterator, T&, T*> riterator; typedef ListIterator<const_iterator, const T&, const T&> const_riterator; */ template<class Iterator, class Ref, class Ptr> struct Reverse_iterator { Iterator _it; // 正向迭代器类 typedef Reverse_iterator<Iterator, Ref, Ptr> 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<T, T&, T*> iterator; typedef ListIterator<T, const T&, const T&> const_iterator; // 反向迭代器也分普通和cosnt类型 typedef Reverse_iterator<iterator, T&, T*> riterator; typedef Reverse_iterator<const_iterator, const T&, const T&> 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()); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。