您好,登錄后才能下訂單哦!
今天小編給大家分享一下C++反向迭代器怎么實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
我們設計的反向迭代器是用正向迭代器實現的,這樣反向迭代器的實現方式就統一了,那么我們反向迭代器的成員變量就是一個正向迭代器,關于成員函數,我們反向迭代器提供的接口與正向迭代器提供的接口一樣。
//第一個模板參數傳遞 正向迭代器,第二個傳遞 迭代器的引用 第三個傳遞 迭代器的地址 template<class Iterator, class Ref, class Ptr> //用struct定義類,因為我們想要公開我們的接口 struct _reverse_iterator { //對自己進行typedef方便使用 typedef _reverse_iterator<Iterator, Ref, Ptr> self; //成員變量 是一個正向迭代器 Iterator _current; //構造函數 用一個正向迭代器進行初始化反向迭代器對象 _reverse_iterator(Iterator it) :_current(it) {} //*運算符重載 Ref operator*(); //前置++運算符重載 self& operator++(); //后置++運算符重載 self operator++(int) //前置--運算符重載 self& operator--() //后置--運算符 self operator--(int) //->操作符 Ptr operator->() //關系運算符 bool operator!=(const self& s); bool operator==(const self& s); }
容器類內的rbegin與rend 函數
//類內使用反向迭代器 class myclass { //此類內要配套有一個正向迭代器iterator,然后傳給外面的反向迭代器 //將反向迭代器進行typedef方便使用 typedef _reverse_iterator<iterator, T&, T*> reverse_iterator; //反向迭代器 typedef _reverse_iterator<iterator, const T&, const T*> const_reverse_iterator; //反向迭代器 reverse_iterator rbegin() { return reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); } //const反向迭代器 const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } };
注意: 反向迭代器這里我們采用了對稱結構便于理解對比,但這也導致我們后面在進行*解引用操作符時要解引用前一個位置!
我們可以創建一個局部對象,對局部對象進行--找到前一個位置,然后再進行解引用返回就行了。
//*運算符重載 Ref operator*() { //這里是不用寫拷貝構造的,默認的拷貝構造會對內置類型進行值拷貝,對自定義類型調用它的拷貝構造 Iterator tmp = _current; --tmp; return *tmp; }
由于我們的反向迭代器是由正向迭代器實現的,反向迭代器++就相當于正向迭代器- - ,明白了這個就很好實現算術運算符重載了。
//前置++運算符重載 self& operator++() { --_current; return(*this); } //后置++運算符重載 self operator++(int) { //保存當前對象 self tmp(*this); --_current; //返回--之前的對象 return tmp; } //前置--運算符重載 self& operator--() { ++_current; return (*this); } //后置--運算符 self operator--(int) { self tmp(*this); ++_current; return tmp; }
->運算符重載我們只需要返回容器中存儲的自定義類型的對象的地址就行了,我們可以先調用operator*()拿到容器中存儲的對象,然后再進行取地址&
Ptr operator->() { return &(operator*()); }
4、關系運算符
要判斷兩個反向迭代器相不相等,只需要判斷反向迭代器里面的成員變量相不相等就行了。
//關系運算符 bool operator!=(const self& s) { return _current != s._current; } bool operator==(const self& s) { return _current == s._current; }
到這里我們的反向迭代器就已經形成了。
由于我們的反向迭代器是用模板寫的,當我們將vector的迭代器類型傳遞過去時,我們的反向迭代器就變成了vector的反向迭代器,當我們將list的迭代器傳遞過去時,就形成了list的反向迭代器。
傳遞的迭代器必須的二元迭代器,可以++ ,- -。forward_list的迭代器就不行!
例如:實現vector的反向迭代器,我們只需要在類內部傳遞一下正向迭代器,然后typedef一下就行了。
template<class T> class vector { public: //正向迭代器 typedef T* iterator; //反向迭代器 將正向迭代器進行傳遞給反向迭代器 typedef _reverse_iterator<iterator, T&, T*> reverse_iterator; typedef _reverse_iterator<iterator, const T&, const T*> const_reverse_iterator; //普通迭代器 ------------------------------------------------ iterator begin(); iterator end(); //const迭代器 typedef const T* const_iterator; const_iterator begin() const; const_iterator end() const; //反向迭代器 reverse_iterator rbegin() { return reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); } //const反向迭代器 const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } ...... ...... ...... };
以上就是“C++反向迭代器怎么實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。