青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-162  評論-223  文章-30  trackbacks-0
   在面向對象開發時,對實際問題分析進而抽象出一種類型,往往會考慮到2個方面:1)類型的內部成員和方法的定義描述 2)類型的多實例存取操作。其中第1點是類型本身數據結構的設計,第2點是類型容器數據結構的選擇設計。在stl中,容器有序列式和關聯式兩種,前者代表有vector,list,deque等;后者代表有set,multiset,map,multimap等,對于一個類型的第2點,我們會考慮甚至是反復權衡選擇序列容器還是關聯容器?在確定選擇了一種之后,比如序列式容器,又會進一步的思考是選擇vetor、list、還是deque?實質上對它們的選擇主要取決于應用的需要,比如要求快速訪問就選擇vetor,要求快速插入刪除就選擇list,符合隊列模型就選擇deque。如果對性能要求較高,就得選擇關聯式容器,這樣訪問、插入、刪除元素都能得到較好的性能。如果操作太頻繁,這時set,map還不行,要選擇hash_set,hash_map等。
   本文僅探討序列式容器的選擇應用,對一個類型而言,既選擇了序列式容器,就意味在vector,list,deque間選擇(這里要說明的是,stack和queue雖然也是序列式容器,但從真正嚴格意義上講,它們只是一種適配器)那么有沒有辦法作一個通用的包裝類提供給開發者,讓開發者自己根據應用決定選擇具體的容器類型呢?同時這個包裝又不影響原容器的接口使用。關于包裝類的實現,代碼描述如下
  1#ifndef _STL_COLLECTION_H
  2#define _STL_COLLECTION_H
  3
  4#include <memory>
  5#include <vector>
  6
  7 /**
  8    @class STLCollection
  9    @brief 基于STL序列容器實現的通用集合類
 10
 11    * 提供以索引作為外參的以下公共通用接口
 12    *  add    --- 向前或向后增加單個元素
 13    *  insert --- 插入單個元素
 14    *  erase --- 刪除單個或多個元素
 15    *  set    --- 修改某個元素
 16    *  get    --- 獲取某個元素
 17    *  front  --- 獲取第一個元素
 18    *  back  --- 獲取最后一個元素
 19*/

 20template<typename T,template<class T,class U > class C = std::vector,template <class T> class U = std::allocator>
 21class STLCollection : public C<T,U<T> >
 22{
 23    typedef U<T> Allocator;
 24    typedef C<T,Allocator> base;
 25
 26public:
 27    //為使用方便,重新定義實現構造函數及拷貝構造函數,但賦值拷貝可以不用重新定義實現
 28    STLCollection()
 29    {
 30    }

 31    explicit STLCollection(const Allocator& al)
 32        :base(al)
 33    {
 34    }

 35    explicit STLCollection(size_t n)
 36        :base(n)
 37    {
 38    }

 39    STLCollection(size_t n,const T& t)
 40        :base(n,t)
 41    {
 42    }

 43    STLCollection(size_t n,const T& t,const Allocator& al)
 44        :base(n,t,al)
 45    {
 46    }

 47    STLCollection(const STLCollection& right)
 48        :base(right)
 49    {
 50    }

 51
 52    template<class InputIterator>
 53    STLCollection(InputIterator first,InputIterator last)
 54        :base(first,last)
 55    {
 56    }

 57
 58    template<class InputIterator>
 59    STLCollection(InputIterator first,InputIterator last,const Allocator& al)
 60        :base(first,last,al)
 61    {
 62    }

 63
 64public:
 65    //使基類的同名函數erase,insert,front,back可見
 66    using base::erase;
 67    using base::insert;
 68    using base::front;
 69    using base::back;
 70
 71    void add(const T& t,bool append = true)
 72    {
 73        if (append)
 74            base::insert(base::end(),t);
 75        else
 76            base::insert(base::begin(),t);
 77    }

 78    void insert(size_t index,const T& t)
 79    {
 80        insert_impl(index,t,typename std::iterator_traits<typename base::iterator>::iterator_category());
 81    }

 82    void erase(size_t index)
 83    {
 84        erase_impl(index,typename std::iterator_traits<typename base::iterator>::iterator_category());
 85    }

 86    void erase(size_t beg,size_t end)
 87    {
 88        erase_impl(beg,end,typename std::iterator_traits<typename base::iterator>::iterator_category());
 89    }

 90    void set(size_t index,const T& t)
 91    {
 92        T* p = get(index);
 93        if (p) *= t;
 94    }

 95    T* get(size_t index) 
 96    {
 97        return get_impl(index,typename std::iterator_traits<typename base::iterator>::iterator_category());
 98    }

 99    const T* get(size_t index) const
100    {
101        return get_impl(index,typename std::iterator_traits<typename base::iterator>::iterator_category());
102    }

103    T* front()
104    {
105        if (base::empty()) return NULL;
106        return &base::front();
107    }

108    const T* front() const
109    {
110        if (base::empty()) return NULL;
111        return &base::front();
112    }

113    T* back()
114    {
115        if (base::empty()) return NULL;
116        return &base::back();
117    }

118    const T* back() const
119    {
120        if (base::empty()) return NULL;
121        return &base::back();
122    }

123    bool is_empty() const
124    {
125        return base::empty();
126    }

127
128private:
129    /*************************************************************************************
130        下面函數僅作內部實現,需要注意以下幾點
131        (1) 不讓其子類和外部可見,故使用private訪問控制
132        (2) 考慮到子類可能會使用using指令來引用,如果為重載形式,子類using引用同名函數
133             會因為private出錯而不能引用public同名函數,故特命名為xxx_impl而非重載形式
134    *************************************************************************************/

135    void insert_impl(size_t index,const T& t,std::random_access_iterator_tag tag)
136    {
137        if (index < base::size())
138        {
139            base::insert(base::begin()+index,t);
140        }

141    }

142    void insert_impl(size_t index,const T& t,std::input_iterator_tag tag)
143    {
144        if (index < base::size())
145        {
146            typename base::iterator it = base::begin();
147            while(index--++it;
148            base::insert(it,t);
149        }

150    }

151    void erase_impl(size_t index,std::random_access_iterator_tag tag)
152    {
153        if (index < base::size())
154        {
155            base::erase(base::begin()+index);
156        }

157    }

158    void erase_impl(size_t index,std::input_iterator_tag tag)
159    {
160        if (index < base::size())
161        {
162            typename base::iterator it = base::begin();
163            while(index--++it;
164            base::erase(it);
165        }

166    }

167    void erase_impl(size_t beg,size_t end,std::random_access_iterator_tag tag)
168    {
169        end = std::min(end,base::size());
170        if (beg < end)
171        {
172            base::erase(base::begin()+beg,base::begin()+end);
173        }

174    }

175    void erase_impl(size_t beg,size_t end,std::input_iterator_tag tag)
176    {
177        end = std::min(end,base::size());
178        if (beg < end)
179        {
180            typename base::iterator it = base::begin();
181            while(beg++ < end) it = base::erase(it);
182        }

183    }

184    T* get_impl(size_t index,std::random_access_iterator_tag tag)
185    {
186        if (index>=base::size())
187            return NULL;
188        return &(*(base::begin()+index));
189    }

190    const T* get_impl(size_t index,std::random_access_iterator_tag tag) const
191    {
192        if (index>=base::size())
193            return NULL;
194        return &(*(base::begin()+index));
195    }

196    T* get_impl(size_t index,std::input_iterator_tag tag)
197    {
198        if (index>=base::size())
199            return NULL;
200        typename base::iterator it = base::begin();
201        while (index--++it;
202        return &(*it);
203    }

204    const T* get_impl(size_t index,std::input_iterator_tag tag) const
205    {
206        if (index>=base::size())
207            return NULL;
208        typename base::const_iterator it = base::begin();
209        while(index--++it;
210        return &(*it);
211    }

212}
;
213
214#endif
   這樣一來,由于STLCollection類提供了通用的操作接口,在應用時如果想切換改變為另一種容器,只需改變第2個模板參數即可,其它部分代碼都不用改變,大大方便了程序的維護擴展,還可以繼承STLCollection類,實現自己特殊的集合類,比如元素類型是_variant_t類型,代碼描述如下

  1#ifndef _VARIANT_COLLECTION_H
  2#define _VARIANT_COLLECTION_H
  3
  4#include <comutil.h>
  5#pragma comment(lib,"comsuppw.lib")
  6
  7class variant_collection : public STLCollection<_variant_t>
  8{
  9    typedef STLCollection<_variant_t> base;
 10
 11public:
 12    using base::add;
 13    using base::insert;
 14    using base::set;
 15
 16    void add(signed char val)
 17    {
 18        add<signed char>(val);
 19    }

 20    void add(unsigned char val)
 21    {
 22        add<unsigned char>(val);
 23    }

 24    void add(short val)
 25    {
 26        add<short>(val);
 27    }

 28    void add(unsigned short val)
 29    {
 30        add<unsigned short>(val);
 31    }

 32    void add(int val)
 33    {
 34        add<int>(val);
 35    }

 36    void add(unsigned int val)
 37    {
 38        add<unsigned int>(val);
 39    }

 40    void add(float val)
 41    {
 42        add<float>(val);
 43    }

 44    void add(double val)
 45    {
 46        add<double>(val);
 47    }

 48    void add(const char* val)
 49    {
 50        add<const char*>(val);
 51    }

 52  
 53    void insert(size_t index,signed char val)
 54    {
 55        insert<signed char>(index,val);
 56    }

 57    void insert(size_t index,unsigned char val)
 58    {
 59        insert<unsigned char>(index,val);
 60    }

 61    void insert(size_t index,short val)
 62    {
 63        insert<short>(index,val);
 64    }

 65    void insert(size_t index,unsigned short val)
 66    {
 67        insert<unsigned short>(index,val);
 68    }

 69    void insert(size_t index,int val)
 70    {
 71        insert<int>(index,val);
 72    }

 73    void insert(size_t index,unsigned int val)
 74    {
 75        insert<unsigned int>(index,val);
 76    }

 77    void insert(size_t index,float val)
 78    {
 79        insert<float>(index,val);
 80    }

 81    void insert(size_t index,double val)
 82    {
 83        insert<double>(index,val);
 84    }

 85    void insert(size_t index,const char* val)
 86    {
 87        insert<const char*>(index,val);
 88    }

 89   
 90    void set(size_t index,signed char val)
 91    {
 92        set<signed char>(index,val);
 93    }

 94    void set(size_t index,unsigned char val)
 95    {
 96        set<unsigned char>(index,val);
 97    }

 98    void set(size_t index,short val)
 99    {
100        set<short>(index,val);
101    }

102    void set(size_t index,unsigned short val)
103    {
104        set<unsigned short>(index,val);
105    }

106    void set(size_t index,int val)
107    {
108        set<int>(index,val);
109    }

110    void set(size_t index,unsigned int val)
111    {
112        set<unsigned int>(index,val);
113    }

114    void set(size_t index,float val)
115    {
116        set<float>(index,val);
117    }

118    void set(size_t index,double val)
119    {
120        set<double>(index,val);
121    }

122    void set(size_t index,const char* val)
123    {
124        set<const char*>(index,val);
125    }

126
127protected:
128    template<typename T>
129    void add(T val)
130    {
131        _variant_t var(val);
132        base::add(var);
133    }

134    template<typename T>
135    void insert(size_t index,T val)
136    {
137        _variant_t var(val);
138        base::insert(index,var);
139    }

140    template<typename T>
141    void set(size_t index,T val)
142    {
143        _variant_t* p_var = base::get(index);
144        if (p_var) *p_var = val;
145    }

146}
;
147
148#endif

posted on 2011-07-16 12:23 春秋十二月 閱讀(1901) 評論(0)  編輯 收藏 引用 所屬分類: Opensrc
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            麻豆91精品91久久久的内涵| 亚洲欧美日韩一区| 欧美成年网站| 亚洲精品欧洲精品| 99在线热播精品免费| 国产精品高清网站| 欧美一区激情视频在线观看| 欧美在线91| 亚洲国产精品福利| 亚洲精品国产欧美| 欧美日韩精品一本二本三本| 亚洲欧美久久| 久久免费少妇高潮久久精品99| 亚洲欧洲日本国产| 中文日韩在线| 亚洲大片一区二区三区| 亚洲精品影视| 国产自产在线视频一区| 亚洲国产精品女人久久久| 国产精品久久久久免费a∨大胸| 欧美一区二区视频97| 浪潮色综合久久天堂| 夜夜嗨av色一区二区不卡| 午夜精品福利在线观看| 亚洲激情在线激情| 亚洲一区二区三区国产| 亚洲福利视频三区| 亚洲午夜一区二区三区| 亚洲精品久久久一区二区三区| 欧美91福利在线观看| 欧美色精品在线视频| 久久午夜羞羞影院免费观看| 欧美日韩一区二区三区高清| 久久精品亚洲一区二区| 欧美日韩精品久久久| 久久综合久久综合这里只有精品| 欧美日韩免费| 免费亚洲视频| 国模精品一区二区三区| 99精品久久久| 亚洲精品一二| 久久精品亚洲国产奇米99| 亚洲免费中文字幕| 欧美高潮视频| 免费不卡在线观看| 国产无一区二区| 一区二区三区欧美亚洲| 日韩一二在线观看| 久久久久久自在自线| 欧美在线看片a免费观看| 欧美日韩精品一二三区| 91久久国产综合久久蜜月精品| 国内精品久久久久久 | 亚洲精选中文字幕| 久久爱www久久做| 国产欧美日韩亚州综合| 亚洲精品影院| 艳妇臀荡乳欲伦亚洲一区| 麻豆精品精华液| 男女视频一区二区| 红杏aⅴ成人免费视频| 欧美一区中文字幕| 久久精品91久久香蕉加勒比| 国产日韩欧美不卡| 午夜综合激情| 久久综合国产精品| 精品白丝av| 免费成人av在线看| 亚洲国产精品国自产拍av秋霞 | 欧美日韩国产黄| 91久久夜色精品国产九色| 亚洲欧洲精品一区二区三区波多野1战4| 久久久噜噜噜久久| 欧美成人情趣视频| 最新日韩av| 欧美视频一区在线观看| 亚洲一二三级电影| 久久深夜福利| 亚洲国产老妈| 欧美日一区二区三区在线观看国产免| 亚洲毛片一区| 午夜精品久久久久久99热软件| 国产精品亚洲人在线观看| 欧美一区二区三区视频在线 | 亚洲视频一区在线观看| 国产精品日韩精品欧美在线| 性欧美激情精品| 欧美国产综合一区二区| 一区二区av在线| 国产精品免费一区二区三区在线观看 | 亚洲毛片网站| 久久精品亚洲| 99在线热播精品免费| 国产精自产拍久久久久久| 久久婷婷国产综合国色天香| 亚洲日本黄色| 久久精品30| 一区二区免费看| 国产在线观看91精品一区| 欧美高清一区二区| 午夜激情一区| 亚洲精品在线视频| 久久精品在这里| 在线亚洲成人| 国产亚洲人成网站在线观看| 欧美成人性生活| 欧美一区免费| 日韩视频一区二区三区在线播放| 欧美在线亚洲一区| 亚洲图片欧洲图片av| 亚洲国产精品黑人久久久| 国产女优一区| 欧美日韩蜜桃| 欧美成人国产| 久久亚洲捆绑美女| 亚洲欧美日韩一区二区三区在线| 亚洲第一成人在线| 久久久精品午夜少妇| 亚洲欧美国产精品专区久久| 亚洲激情图片小说视频| 国产一区二区三区成人欧美日韩在线观看 | 一区二区三区久久久| 欧美高清视频在线| 久久99伊人| 亚洲一区三区电影在线观看| 亚洲国产免费| 在线电影国产精品| 国产专区欧美精品| 国产美女精品一区二区三区| 欧美日韩国产综合网| 欧美bbbxxxxx| 美女网站在线免费欧美精品| 性亚洲最疯狂xxxx高清| 在线一区免费观看| 99国内精品久久| 亚洲国产精品嫩草影院| 亚洲成人在线视频播放| 蜜桃av一区| 老色鬼久久亚洲一区二区| 久久精品视频在线| 久久久福利视频| 久久精品国产99精品国产亚洲性色| 正在播放亚洲一区| 亚洲校园激情| 亚洲欧美日韩国产精品| 亚洲一区成人| 午夜精品福利视频| 亚洲欧美日本日韩| 欧美在线日韩精品| 久久久久久久97| 免费在线成人| 亚洲国产导航| 99亚洲一区二区| 亚洲天堂久久| 欧美一区二区大片| 久久影音先锋| 欧美人成在线| 国产模特精品视频久久久久| 国产精品一区二区久久久| 国产日韩欧美三区| 在线播放豆国产99亚洲| 亚洲日本在线观看| 亚洲字幕一区二区| 久久国产精品久久久久久久久久| 久久精品亚洲国产奇米99| 欧美大片在线看免费观看| 亚洲高清在线观看| 艳妇臀荡乳欲伦亚洲一区| 亚洲一区欧美一区| 久久久久久精| 欧美看片网站| 国产综合欧美在线看| 最新亚洲电影| 欧美一区不卡| 亚洲大黄网站| 销魂美女一区二区三区视频在线| 久久久综合香蕉尹人综合网| 欧美人体xx| 韩国欧美国产1区| 日韩视频在线一区二区| 性欧美18~19sex高清播放| 欧美va亚洲va国产综合| 中文一区字幕| 免费观看成人网| 国产伦精品一区二区三区照片91 | 欧美日韩免费一区二区三区视频 | 麻豆精品在线视频| 国产精品一区二区a| 亚洲裸体俱乐部裸体舞表演av| 亚洲欧美另类在线观看| 欧美电影在线观看完整版| 亚洲一区二区精品| 欧美激情精品久久久久久大尺度 | 国产精品天美传媒入口| 亚洲精品偷拍| 亚洲精品护士| 久久亚洲精品一区| 亚洲专区免费| 欧美性猛交视频| 亚洲精品日韩激情在线电影|