一、reverse_iterator.h
#pragma once
namespace txf
{ //外界傳什么類型的iteator,它就用什么iterator 初始化 , list用_list_iterator<T,T&,,T*> ,vector<T> 用T*template<class Iterator,class Ref,class Ptr>//在這個反向迭代器中涉及到返回引用和地址的const/普通對象,struct ReverseIterator //所以用模版Ref 和 Ptr{typedef ReverseIterator<Iterator, Ref, Ptr> self;Iterator _it;//反向迭代器除去接口,就只是一個正向迭代器,反向迭代器的接口建立在正向迭代器的接口之上,所以需要一個正向迭代器作為ta的成員變量ReverseIterator(Iterator it)//外界傳哪里的地址,它就在那個地址上,然后ta可以有一系列操作:_it(it){}Ref operator *()//不動當前數據 {Iterator tmp(_it);return *(--tmp);}Ptr oprtator->(){return &(operator*());}self& operator++(){--_it;return *this;}self& operator++(int){self tmp(_it);--_it;return tmp;}self& operator--(int){self tmp(_it);++_it;return tmp;}self& operator--(){++_it;return *this;}bool operator!=(const self& s)const{return _it != s._it;}bool operator==(const self& s)const{return _it == s._it;}};
}
二、反向迭代器的介紹
template<class Iterator,class Ref,class Ptr>//在這個反向迭代器中涉及到返回引用和地址的const/普通對象,
- 反向迭代器是一個模板類,外界傳什么類型的iteator,它就要適配出該類型的反向迭代器,所以,ta 也是一個適配器,即適配正向迭代器達到反向遍歷的效果,通過對正向迭代器實例化出的對象的接口進行封裝進而達到反向遍歷的效果?,當正向迭代器的- -時,反向迭代器++,正向迭代器的++,反向迭代器的- -
- 在這個反向迭代器中涉及到返回引用和地址的const/普通對象,所以我們傳模版,Ref - T&/const T&,? Ptr - T*/const T*,更方便
struct ReverseIterator
- strcut的默認訪問方式是public,方便直接訪問其成員
typedef ReverseIterator<Iterator, Ref, Ptr> self;
- 為了便利 ,將迭代器的類型ReverseIterator<Iterator, Ref, Ptr>使用typedef重命名為self
Iterator _it;
- 反向迭代器除去接口,就只是一個正向迭代器,反向迭代器的接口建立在正向迭代器的接口之上,所以需要一個正向迭代器作為ta的成員變量
ReverseIterator(Iterator it):_it(it){}
- 外界傳哪里的地址,它就指向那個地址上,然后ta可以一系列操作:++、--.....
Ref operator *(){Iterator tmp(_it);return *(--tmp);}
- 不動當前數據?
- begin() : 頭結點的地址
- end() : 尾節點的地址的下一個位置
- rbegin() :?尾節點的地址
- rend() :?頭結點的地址的下一個位置
原先的指向 :
為了讓正向迭代器與反向迭代器相對應 :
實現上圖的效果,我們在用反向迭代器時,用begin 初始化 rend(把begin 的地址拷貝給rend) ,用end 初始化rbegin,因此,反向迭代器的rend 和 rbegin 對應原先的位置是相當于往后走了一步,我們在用時要把它還原回來,所以要 "--tmp" ,??讓正向迭代器與反向迭代器相對應只是想對稱,讓它的底層是圖二這樣的, 但在使用的時候要讓它是圖一這樣的
Ptr oprtator->()
{return &(operator*());
}
- 當容器內部存儲的是結構體類型的時候,可以使用->取出成員的地址,即結構體地址也就是該位置的迭代器進行返回
- 模板參數Ptr,這里對于返回值,直接采用Ptr即可,對應const對象和普通對象都會在容器的實現中傳入對應的類型
self& operator++(){--_it;return *this;}
- 這里實際上是調用的正向迭代器_it的- -完成的
- 返回this指針指向的對象,由于*this的對象存在,不會銷毀,這里返回其引用
self& operator--(){++_it;return *this;}
- 這里實際上是調用的正向迭代器_it++完成的
- 返回this指針指向的對象,由于*this的對象存在,不會銷毀,這里返回其引用
bool operator!=(const self& s)const{return _it != s._it;}
- 進行兩個反向迭代器的比較,采用引用傳參,減少拷貝
- 反向迭代器本質是對正向迭代器的封裝,進行反向迭代器的比較,也可以調用正向迭代器的比較
bool operator==(const self& s)const{return _it == s._it;}
- 進行兩個反向迭代器的比較,采用引用傳參,減少拷貝
- 反向迭代器本質是對正向迭代器的封裝,進行反向迭代器的比較,也可以調用正向迭代器的比較
總結
本文,小編我只是簡單的介紹了reverse_iterator 的實現和解釋,我們寫的反向迭代器是泛型的,支持正向迭代器的容器都能使用,在 vector 或 list 中?都會把ReverseIterator<iterator, T&, T*> ?tpedef 成reverse_iterator/ReverseIterator<const_iterator ,const T&,const T*> typedef 成const_reverse_iterator ,在類中實現reverse_iterator的函數