国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++設計模式之迭代器模式(Iterator)

2020-01-26 13:44:04
字體:
來源:轉載
供稿:網(wǎng)友

迭代器在STL運用廣泛,類似容器的迭代已經(jīng)成為其重要特性,而迭代器模式則是利用迭代器概念進行的抽象運用,迭代器模式運用廣泛和有用,因為其能夠不考慮數(shù)據(jù)的存儲方式,而是直接面對數(shù)據(jù)進行迭代,也就是說我們不用考慮集合是數(shù)組(或vector)、鏈表、棧還是隊列,而是通過統(tǒng)一的接口進行順序的訪問。

作用

迭代器模式提供了一種順序訪問容器中元素的方法,而無需了解器內(nèi)部的類型和結構,該模式的核心思想將訪問和遍歷容器對象的功能交給一個外部的迭代器對象,該迭代器定義了訪問聚合對象的接口,

類視圖

實現(xiàn)

class Item{public:  Item(string strName,float price):  m_name(strName),m_price(price){}  Item(Item& item):  m_name(item.strName),m_price(item.price){}    string tostring()  {    std::ostringstream buffer;    buffer << f;    string strPrice = buffer.str();    strName += " :";        return strName + strPrice;  }private:  string m_name;  float m_price;}class Container;class Menu;class Iterator{public:  virtual ~Iterator(){}  virtual void first()=0;  virtual void next()=0;  virtual bool hasnext()=0;  virtual Item* current()=0;protected:  Container * m_pContainer;}class Container {public:  virtual ~Container() {};  virtual void CreateIterator()= 0; protected:  Observer(){};};class MenuIterator : public Iterator{   Menu * m_menu;   int curpos; public:   MenuIterator(Menu*a):m_menu(a),curpos(0){}   virtual void first()   {     curpos=0;   }   virtual void next()   {     curpos++;   }   virtual bool hasnext()   {     if(curpos >=0 && curpos< m_menu->size())   }   virtual Item* current()   {    return m_menu->value(curpos);   }}; class Menu : public Container{public:  virtual ~Menu()   {    for(int i=0 ; i< m_items.size(); i++)    {      delete m_items[i];    }  };  Iterator* CreateIterator()   {    return new MenuIterator(this);   }    int size()  {    return m_items.size();  }  Item* value(int nIndex)  {    if(nIndex>=0 && nIndex<m_items.size())    {      return m_items[nIndex];    }    else    {      return NULL;    }  }  void additem(Item& item)  {    Item *pItem = new Item(item);    m_items.push_back(pItem);  }    private:   vector<item* > m_items; };int main(){  Item it1("chicken", 10.0);    Item it2("Apple", 5.0);    Item it3("Beaf", 20.0);    Item it4("soup",15.0);        Menu menu;  menu.additem(it1);  menu.additem(it2);  menu.additem(it3);  menu.additem(it4);      Iterator itor = menu.CreateIterator();  while(itor->hasnext())  {    Item* pItem = itor->current();    if(pItem)      cout<<pItem->tostring()<<endl;    itor->next();  }}

對于上例來說,Iterator接口是不變的,不管menu中的聚合內(nèi)容的形式如何變化,只要menu根據(jù)其類型提供其取值、大小等的操作,那么對于使用者來說都是一樣的操作。

應用場景

  • 訪問一個聚合對象的內(nèi)容而無需暴露它的內(nèi)部表示;
  • 支持對聚合對象的多種遍歷(從前到后,從后到前);
  • 為遍歷不同的聚合結構提供一個統(tǒng)一的接口,支持多態(tài)迭代。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 鄄城县| 额尔古纳市| 武冈市| 文山县| 孝义市| 宁武县| 禄丰县| 琼结县| 莱芜市| 尚志市| 马关县| 乐至县| 马公市| 林口县| 固安县| 财经| 临泽县| 安阳市| 明光市| 霍邱县| 永济市| 永善县| 顺昌县| 嘉峪关市| 遵义县| 海兴县| 黄冈市| 江孜县| 吉首市| 绿春县| 新龙县| 洪湖市| 那曲县| 常德市| 旬邑县| 南通市| 武山县| 甘孜县| 黔东| 水富县| 玛纳斯县|