網(wǎng)站首頁 編程語言 正文
反向迭代器其實(shí)就行對正向迭代器進(jìn)行封裝,源生迭代器,為了實(shí)現(xiàn)運(yùn)算符的結(jié)果不同,正向迭代器也對源生迭代器進(jìn)行了封裝。
反向迭代器的適配器,就是 Iterator是哪個(gè)容器的迭代器,reverse_iterator < Iterator >就可以 適配出哪個(gè)容器的反向迭代器。復(fù)用的體現(xiàn)。
反向迭代器適配器結(jié)構(gòu):
template <class Iterator, class Ref, class Ptr>
class reverse_iterator
{
typedef reverse_iterator<Iterator, Ref, Ptr> self;
public:
// 重載運(yùn)算符函數(shù)
private:
Iterator _it;
};
源碼容器獲取迭代器時(shí)具體情況,如圖:
我們以為的情況:
這是源碼里的實(shí)現(xiàn)的大概情況,begin()與rend()對稱,end()與rbegin()對稱。這與我們想的不一樣,所以反向迭代器適配器內(nèi)部實(shí)現(xiàn)的也有所不一樣。例如:
如果我們按照源碼的思路寫,反向迭代器里封裝了一個(gè)正向迭代器_it,正常的++,–等操作只需要調(diào)用_it的–,++運(yùn)算符重載函數(shù)即可。除了,operator*需要特寫,如下代碼:
Ref operator*()
{
//正常思路
//return *_it;
// 源碼思路
Iterator prev = _it;
return *--prev;
}
正常情況是解引用迭代器,但是源碼的思路是往后一個(gè)位置的迭代器才是。這也是因?yàn)閞begin,和rend實(shí)現(xiàn)的原因?qū)е碌摹?/p>
適配出來的反向迭代器其用法和正向迭代器一樣;
反向迭代器根正向迭代器區(qū)別就是++、–的方向是相反的所以反向迭代器封裝正向迭代器即可,重載控制++、–的方向。
源碼的設(shè)計(jì)追求對稱,我們設(shè)計(jì)可以不按源碼走,在容器實(shí)現(xiàn)rbegin(),rend()時(shí),要按照反向迭代器的設(shè)計(jì)風(fēng)格去實(shí)現(xiàn)。
list完整樣例:
1、反向迭代器適配器
// Iterator是哪個(gè)容器的迭代器,reverse_iterator<Iterator>就可以
// 適配出哪個(gè)容器的反向迭代器。復(fù)用的體現(xiàn)
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 -> 類去分裝節(jié)點(diǎn)指針,重載*、++ 等運(yùn)算符,讓它們像指針一樣使用
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容器
注意:這里只涉及反向迭代器的內(nèi)容
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;// 頭結(jié)點(diǎn)指針
};
測試代碼:
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
相關(guān)推薦
- 2022-12-26 python-httpx的使用及說明_python
- 2022-08-11 利用python繪制線型圖_python
- 2022-11-02 Linux命令sed(流編輯器)的用法詳解_linux shell
- 2021-12-12 C/C++?Qt?數(shù)據(jù)庫QSql增刪改查組件應(yīng)用教程_C 語言
- 2022-03-29 python語法?range()?序列類型range_python
- 2022-07-30 C語言強(qiáng)制類型轉(zhuǎn)換規(guī)則實(shí)例詳解_C 語言
- 2022-09-03 列表頁常見hook封裝實(shí)例_React
- 2022-05-29 C++的多態(tài)與虛函數(shù)你了解嗎_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支