• <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>
            隨筆-159  評(píng)論-223  文章-30  trackbacks-0
               在面向?qū)ο箝_(kāi)發(fā)時(shí),對(duì)實(shí)際問(wèn)題分析進(jìn)而抽象出一種類(lèi)型,往往會(huì)考慮到2個(gè)方面:1)類(lèi)型的內(nèi)部成員和方法的定義描述 2)類(lèi)型的多實(shí)例存取操作。其中第1點(diǎn)是類(lèi)型本身數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì),第2點(diǎn)是類(lèi)型容器數(shù)據(jù)結(jié)構(gòu)的選擇設(shè)計(jì)。在stl中,容器有序列式和關(guān)聯(lián)式兩種,前者代表有vector,list,deque等;后者代表有set,multiset,map,multimap等,對(duì)于一個(gè)類(lèi)型的第2點(diǎn),我們會(huì)考慮甚至是反復(fù)權(quán)衡選擇序列容器還是關(guān)聯(lián)容器?在確定選擇了一種之后,比如序列式容器,又會(huì)進(jìn)一步的思考是選擇vetor、list、還是deque?實(shí)質(zhì)上對(duì)它們的選擇主要取決于應(yīng)用的需要,比如要求快速訪問(wèn)就選擇vetor,要求快速插入刪除就選擇list,符合隊(duì)列模型就選擇deque。如果對(duì)性能要求較高,就得選擇關(guān)聯(lián)式容器,這樣訪問(wèn)、插入、刪除元素都能得到較好的性能。如果操作太頻繁,這時(shí)set,map還不行,要選擇hash_set,hash_map等。
               本文僅探討序列式容器的選擇應(yīng)用,對(duì)一個(gè)類(lèi)型而言,既選擇了序列式容器,就意味在vector,list,deque間選擇(這里要說(shuō)明的是,stack和queue雖然也是序列式容器,但從真正嚴(yán)格意義上講,它們只是一種適配器)那么有沒(méi)有辦法作一個(gè)通用的包裝類(lèi)提供給開(kāi)發(fā)者,讓開(kāi)發(fā)者自己根據(jù)應(yīng)用決定選擇具體的容器類(lèi)型呢?同時(shí)這個(gè)包裝又不影響原容器的接口使用。關(guān)于包裝類(lèi)的實(shí)現(xiàn),代碼描述如下
              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序列容器實(shí)現(xiàn)的通用集合類(lèi)
             10
             11    * 提供以索引作為外參的以下公共通用接口
             12    *  add    --- 向前或向后增加單個(gè)元素
             13    *  insert --- 插入單個(gè)元素
             14    *  erase --- 刪除單個(gè)或多個(gè)元素
             15    *  set    --- 修改某個(gè)元素
             16    *  get    --- 獲取某個(gè)元素
             17    *  front  --- 獲取第一個(gè)元素
             18    *  back  --- 獲取最后一個(gè)元素
             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    //為使用方便,重新定義實(shí)現(xiàn)構(gòu)造函數(shù)及拷貝構(gòu)造函數(shù),但賦值拷貝可以不用重新定義實(shí)現(xiàn)
             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    //使基類(lèi)的同名函數(shù)erase,insert,front,back可見(jiàn)
             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        下面函數(shù)僅作內(nèi)部實(shí)現(xiàn),需要注意以下幾點(diǎn)
            131        (1) 不讓其子類(lèi)和外部可見(jiàn),故使用private訪問(wèn)控制
            132        (2) 考慮到子類(lèi)可能會(huì)使用using指令來(lái)引用,如果為重載形式,子類(lèi)using引用同名函數(shù)
            133             會(huì)因?yàn)閜rivate出錯(cuò)而不能引用public同名函數(shù),故特命名為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
               這樣一來(lái),由于STLCollection類(lèi)提供了通用的操作接口,在應(yīng)用時(shí)如果想切換改變?yōu)榱硪环N容器,只需改變第2個(gè)模板參數(shù)即可,其它部分代碼都不用改變,大大方便了程序的維護(hù)擴(kuò)展,還可以繼承STLCollection類(lèi),實(shí)現(xiàn)自己特殊的集合類(lèi),比如元素類(lèi)型是_variant_t類(lèi)型,代碼描述如下

              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 春秋十二月 閱讀(1892) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Opensrc
            亚洲精品国产第一综合99久久| 人妻精品久久久久中文字幕69 | 久久精品毛片免费观看| 精品无码久久久久久久久久| 精品久久久久久久中文字幕| 欧美牲交A欧牲交aⅴ久久| 国产成人精品久久一区二区三区av | 国产精品久久久久无码av| 久久精品国产AV一区二区三区| 久久99国内精品自在现线| 久久免费视频6| 国产精品综合久久第一页| www.久久热.com| 久久国产精品99久久久久久老狼| 国产精品久久久久蜜芽| 久久久久99精品成人片三人毛片| 精品久久8x国产免费观看| 久久精品国产99国产精品导航 | 亚洲精品无码成人片久久| 久久受www免费人成_看片中文| 99久久国产亚洲高清观看2024| 久久线看观看精品香蕉国产| 国内精品伊人久久久久网站| 久久久久久极精品久久久| 狠狠色狠狠色综合久久| 久久久久久久99精品免费观看| 91久久九九无码成人网站| 国产精品久久久久久五月尺| 亚洲色大成网站www久久九| 精品国产一区二区三区久久| 亚洲国产精品久久66| 无码人妻久久一区二区三区| 国产成人久久777777| 久久人人添人人爽添人人片牛牛| 精品精品国产自在久久高清| 久久久久久久波多野结衣高潮| 久久精品国产亚洲av麻豆小说| 久久精品夜色噜噜亚洲A∨| 久久香蕉国产线看观看乱码 | 伊人久久大香线蕉影院95| 久久亚洲精品中文字幕|