網站首頁 編程語言 正文
反向迭代器其實就行對正向迭代器進行封裝,源生迭代器,為了實現運算符的結果不同,正向迭代器也對源生迭代器進行了封裝。
反向迭代器的適配器,就是 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);
}
原文鏈接:https://blog.csdn.net/weixin_58004346/article/details/125961681
相關推薦
- 2023-01-09 初識C++?Vector模板與實例化原理_C 語言
- 2023-04-20 正則表達式:判斷是否符合USD格式
- 2022-06-17 Go語言學習之函數的定義與使用詳解_Golang
- 2023-01-13 基于C#實現屏幕取色器_C#教程
- 2021-12-06 C/C++?Qt?數據庫與ComBox實現多級聯動示例代碼_C 語言
- 2023-01-23 C#實現鼠標左右鍵切換效果_C#教程
- 2023-10-11 在枚舉類中“優雅地”使用枚舉處理器
- 2022-09-10 親自教你在netty中使用TCP協議請求DNS服務器的詳細過程_服務器其它
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支