<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
反向迭代器其實就行對正向迭代器進行封裝,源生迭代器,為了實現運運算元的結果不同,正向迭代器也對源生迭代器進行了封裝。
反向迭代器的介面卡,就是 Iterator是哪個容器的迭代器,reverse_iterator < Iterator >就可以 適配出哪個容器的反向迭代器。複用的體現。
反向迭代器介面卡結構:
template <class Iterator, class Ref, class Ptr> class reverse_iterator { typedef reverse_iterator<Iterator, Ref, Ptr> self; public: // 過載運運算元函數 private: Iterator _it; };
原始碼容器獲取迭代器時具體情況,如圖:
我們以為的情況:
這是原始碼裡的實現的大概情況,begin()與rend()對稱,end()與rbegin()對稱。這與我們想的不一樣,所以反向迭代器介面卡內部實現的也有所不一樣。例如:
如果我們按照原始碼的思路寫,反向迭代器裡封裝了一個正向迭代器_it,正常的++,–等操作只需要呼叫_it的–,++運運算元過載函數即可。除了,operator*需要特寫,如下程式碼:
Ref operator*() { //正常思路 //return *_it; // 原始碼思路 Iterator prev = _it; return *--prev; }
正常情況是解除參照迭代器,但是原始碼的思路是往後一個位置的迭代器才是。這也是因為rbegin,和rend實現的原因導致的。
適配出來的反向迭代器其用法和正向迭代器一樣;
反向迭代器根正向迭代器區別就是++、–的方向是相反的所以反向迭代器封裝正向迭代器即可,過載控制++、–的方向。
原始碼的設計追求對稱,我們設計可以不按原始碼走,在容器實現rbegin(),rend()時,要按照反向迭代器的設計風格去實現。
list完整樣例:
1、反向迭代器介面卡
// Iterator是哪個容器的迭代器,reverse_iterator<Iterator>就可以 // 適配出哪個容器的反向迭代器。複用的體現 template <class Iterator, class Ref, class Ptr> class reverse_iterator { typedef reverse_iterator<Iterator, Ref, Ptr> self; public: reverse_iterator(Iterator it) :_it(it) {} Ref operator*() { //正常思路 //return *_it; Iterator prev = _it; return *--prev; } Ptr operator->() { return &operator*(); } self& operator++() { --_it; return *this; } self& operator--() { ++_it; return *this; } bool operator!= (const self& rit) { return _it != rit._it; } private: Iterator _it;// 封裝任何型別的正向迭代器 };
二、list 正向迭代器
// iterator -> 類去分裝節點指標,過載*、++ 等運運算元,讓它們像指標一樣使用 template<class T,class Ref,class Ptr> class _list_iterator { public: typedef _list_iterator < T, Ref,Ptr> self; typedef ListNode<T> Node; _list_iterator( Node* x) :_node(x) {} // ++it self& operator++() { _node = _node->_next; return *this; } // it++ self operator++(int) { self tmp(*this); _node = _node->_next; return tmp; } // --it self& operator--() { _node = _node->_pre; return *this; } // it-- self operator--(int) { self tmp(*this); _node = _node->_pre; return tmp; } //* Ref operator*() { return _node->_data; } //-> Ptr operator->() { return &(_node->_data); } //!= bool operator!=(const self& x) { return _node != x._node; } //== bool operator==(const self& x) { return _node == x._node; } Node* _node; };
三、 list容器
注意:這裡只涉及反向迭代器的內容
template<class T> class list { public: typedef ListNode<T> Node; typedef _list_iterator<T, T&, T*> iterator; typedef _list_iterator<T, const T&, const T*> const_iterator; typedef reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator; typedef reverse_iterator<iterator, T&, T*> reverse_iterator; reverse_iterator rbegin() { return reverse_iterator(end()); } const_reverse_iterator rbegin()const { return const_reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); } const_reverse_iterator rend()const { return const_reverse_iterator(begin()); } iterator begin() { return iterator(_head->_next); } iterator end() { return iterator(_head); } const_iterator begin()const { return const_iterator(_head->_next); } const_iterator end()const { return const_iterator(_head); } list() { _head= new Node(); _head->_next = _head; _head->_pre = _head; } void push_back(const T&x) { Node* newnode = new Node(x); Node* tail = _head->_pre; newnode-> _pre = tail; tail->_next = newnode; newnode->_next = _head; _head->_pre = newnode; } private: Node* _head;// 頭結點指標 };
測試程式碼:
void test11() { BBQ::list<int> L1; L1.push_back(1); L1.push_back(2); L1.push_back(3); reverse_print_list(L1); }
到此這篇關於C++ STL反向迭代器的實現的文章就介紹到這了,更多相關C++ STL反向迭代器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45