3. 使用
4. 總結
在經典的設計模式中,有一種迭代器模式,定義為:提供乙個物件來順序訪問聚合物件中的一系列資料,而不暴露聚合物件的內部表示。
迭代器的主要優點如下。
訪問乙個聚合物件的內容而無須暴露它的內部表示。
遍歷任務交由迭代器完成,這簡化了聚合類。
它支援以不同方式遍歷乙個聚合,甚至可以自定義迭代器的子類以支援新的遍歷。
增加新的聚合類和迭代器類都很方便,無須修改原有**。
封裝性良好,為遍歷不同的聚合結構提供乙個統一的介面。
首先,我們簡單的模擬乙個單項鍊表,這個鍊錶可以往表頭插入資料,並且返回表頭。
首先,我們需要乙個listitem
表示每個鍊錶節點,這個宣告如下:
namespace bh
listitem
(t&& t)
:data
(std::forward
(t))
,next
(nullptr
)template
<
typename..
. types>
listitem
(types&&..
. args)
:data
(std::forward
(args)..
.),next
(nullptr
)void
setnext
(listitem
* n)
listitem
*next()
friend std::ostream&
operator
<<
(std::ostream& out, listitem& d)
;private
: listitem
* next;
t* data;};
template
<
typename t>
std::ostream&
operator
<<
(std::ostream& out, listitem
& d)
}
首先這裡建構函式:
支援普通構造。
支援移動函式。
支援引數完美**。
友元operator<<
,支援資料輸出。
對於移動函式可以參考:c++ 移動函式原理**。
對於引數完美**,參考:c++ 理解std::forward完美**。
這個類實現乙個鍊錶,支援簡單的插入,並且返回頭部節點。
namespace bh
void
push
(const t& t)
void
push
(t&& t)
template
<
typename..
. types>
void
emplace
(types&&..
. args)
listitem
*front()
private
: listitem
* head;};
}
如上,為了演示,這個類實現的很簡單,只支援push,和front兩個操作。
使用過stl都知道,iterator主要是用來遍歷容器中的資料節點,那麼上面這個list,我們的主要功能是能夠不用在外部知道list的實現原理,使用iterator來遍歷資料。
所以iterator的主要功能有:
支援++,遍歷元素。
支援*,取元素程式。
支援->,指標操作。
支援==和!=操作,比較iterator是否到了結尾。
所以這個實現可以如下:
namespace bh
bool
operator==(
const listiter& rhs)
const
noexcept
bool
operator!=(
const listiter& rhs)
const
noexcept
listiter&
operator++(
) listiter&
operator++(
int)
reference operator*(
) pointer operator
->()
private
: pointer iter;};
}
接下來,我們看一下這個iterator如何使用:
int
main
(int args,
char
* ar**)
return0;
}
輸出:
kmm
efgabcd
world
hello
從網上找了乙個迭代器模式的uml類圖,如下:
迭代器的主要作用是提供乙個物件來順序訪問聚合物件中的一系列資料,而不暴露聚合物件的內部表示。通用stl的迭代器的作用也是如此,我們在使用stl的時候,不用關係vector,map,set,unordered_map的實現底層原理,使用迭代器,我們就可以遍歷容器的節點資料了。
C 迭代器(Iterator)詳解
迭代器 iterator 的介紹 背景 指標可以用來遍歷儲存空間連續的資料結構,但是對於儲存空間費連續的,就需要尋找乙個行為類似指標的類,來對非陣列的資料結構進行遍歷。定義 迭代器是一種檢查容器內元素並遍歷元素的資料型別。迭代器提供對乙個容器中的物件的訪問方法,並且定義了容器中物件的範圍。迭代器 i...
C 迭代器(Iterator)詳解
1 迭代器 iterator 的介紹 背景 指標可以用來遍歷儲存空間連續的資料結構,但是對於儲存空間非連續的,就需要尋找乙個行為類似指標的類,來對非陣列的資料結構進行遍歷。定義 迭代器是一種檢查容器內元素並遍歷元素的資料型別。迭代器提供對乙個容器中的物件的訪問方法,並且定義了容器中物件的範圍。迭代器...
C 迭代器Iterator詳解
用處 指標可以用來遍歷儲存空間連續的資料結構,但是對於儲存空間非連續的,就需要尋找乙個行為類似指標的類,來對非陣列的資料結構進行遍歷。定義 迭代器是一種檢查容器內元素並遍歷元素的資料型別,提供了對乙個容器中物件的訪問方法 每種容器型別都定義了自己的迭代器型別,如vector vector int i...