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