迭代器模式?感覺很奇怪的名字。
這個名字是有些奇怪,不過我們在使用stl的時候,都用過迭代器。這時可能又有人問了這麼平常的一種東西也是一種模式?
答案是肯定的。
世界上很多看起來習以為常的東西其實一點也不平常,甚至很難深入的理解。我們經常使用迭代器,可是如果你問一下迭代器到底是什麼,肯定有很多人不能說的很清楚。在開始**之前,我們先給出乙個迭代器模式的定義好了:提供一種方法順序訪問乙個聚合物件的各個元素,又不暴露該物件的內部表示。
再簡單一點,迭代器是一種訪問聚合物件的一種表示。
下面我們通過寫乙個list模板,來體會一下什麼是迭代器模式:
iterator.h
/*
**@the dark fairy tale**
**@16/7/28**
*///node
templatestruct clistnode
;//clist
template class clist
t & operator*();
iterator operator++(int);
iterator operator--(int);
bool operator!=(const iterator & lhs);
bool operator==(const iterator & lhs);
protected:
clistnode* m_node;
friend clist;
iterator(clistnode*node) :m_node(node) //帶參構造被呼叫
};public:
clist();
~clist();
void push_back(const t node); //尾部新增
void pop_back(); //尾部刪除
iterator& end(); //指向最後乙個元素的下乙個
iterator& begin(); //指向第乙個元素
iterator insert(iterator it, const t node); //指定位置插入特定元素
iterator erase(iterator it); //刪除特定元素
unsigned int size();
bool empty();
void clear(); //清空
private:
clistnode* m_head;
clistnode* m_tail;
unsigned int m_size;
};//--------iterator--------//
templatet & clist::iterator::operator*()
templatetypename clist::iterator clist::iterator::operator++(int)
template typename clist::iterator clist::iterator::operator--(int)
template bool clist::iterator::operator!=(const iterator & lhs)
template bool clist::iterator::operator==(const iterator & lhs)
//----clist----//
template typename clist::iterator clist::erase(iterator it)
template typename clist::iterator clist::insert(iterator it, const t nodedata)
template typename clist::iterator& clist::begin()
template typename clist::iterator& clist::end()
template clist::~clist()
template clist::clist() :m_size(0)
template void clist::pop_back()
template void clist::push_back(const t node)
templatevoid clist::clear()
template unsigned int clist::size()
template bool clist::empty()
/************************使用測試*******************************************/
#include "iterator.h"
#include int main()
clist::iterator iter = list.begin();
clist::iterator iterend = list.end();
for (; iter != iterend; iter++)
printf("after pop_back-----------\n");
list.pop_back();
iter = list.begin();
iterend = list.end();
for (; iter != iterend; iter++)
printf("after erase-----------\n");
iter = list.begin();
iter++;
list.erase(iter);
iter = list.begin();
iterend = list.end();
for (; iter != iterend; iter++)
int a = 22;
printf("after insert-----------\n");
iter = list.end();
for (int i = 0; i < 2; i++)
list.insert(iter, a);
iter = list.begin();
iterend = list.end();
for (; iter != iterend; iter++)
printf("lsit size =%d\n", list.size());
printf("after clear-----------\n");
list.clear();
iter = list.begin();
iterend = list.end();
for (; iter != iterend; iter++)
printf(" is empty %d -----------\n", list.empty());
return 0;
}
對於這個雙向迴圈list的模板的實現,想必已經讓你感覺到,「常用的東西原來竟然是這樣的」! 設計模式C 版 第十六式享元模式
享元模式 運用共享技術,有效支援大量細粒度的物件。在享元物件內部且不會隨環境改變而改變的部分,成為享元物件的內部狀態。而隨環境改變而改變的,不可以共享的狀態稱為外部狀態。內部狀態,儲存在享元物件中 外部狀態可以考慮由客戶端物件儲存和計算,在呼叫享元物件的時候,傳遞給享元物件。pragma once ...
C 設計模式 迭代器模式
迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部表示。迭代器模式結構圖 iterator迭代器抽象類 class iterator public virtual object first 0 virtual object next 0 virtual ...
C 設計模式 迭代器模式
迭代器模式 提供一種方法順序訪問乙個聚合物件中的各個元素,而又不暴露其內部的結構 每一種資料結構 包括自定義 遍歷自身內部的資料方式都是不同的。但是我們又希望和常規的遍歷方式一樣呼叫,就如for和foreach一樣遍歷。想要以相同的方式遍歷不同型別的聚合物件,首先就要有乙個相同的介面方法來統一獲取,...