国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 兰考县| 怀来县| 丘北县| 观塘区| 拜泉县| 临湘市| 含山县| 杭锦后旗| 锡林浩特市| 昌吉市| 德州市| 恭城| 兴和县| 湛江市| 铁岭市| 沅江市| 盐源县| 保山市| 新绛县| 乌兰察布市| 石渠县| 耒阳市| 三原县| 镇平县| 广水市| 靖江市| 土默特左旗| 安化县| 始兴县| 方山县| 嘉祥县| 康平县| 嘉荫县| 高陵县| 开化县| 临高县| 岳西县| 曲沃县| 滨州市| 丹东市| 西丰县|