設計模式C 版 第六式迭代器模式

2021-07-22 01:09:32 字數 3498 閱讀 6874

迭代器模式?感覺很奇怪的名字。

這個名字是有些奇怪,不過我們在使用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一樣遍歷。想要以相同的方式遍歷不同型別的聚合物件,首先就要有乙個相同的介面方法來統一獲取,...