• <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>
            xiaoguozi's Blog
            Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習(xí)慣原本生活的人不容易改變,就算現(xiàn)狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預(yù)料,人們需要更細(xì)心的觀察別人,要隨時(shí)注意才能保護(hù)別人,因?yàn)樗麄兾幢刂雷约阂裁础ぁぁぁぁ?/span>

            用template要求寫一個(gè)模板函數(shù),返回值要求是參數(shù)類型,初步設(shè)計(jì)
            template<typename T>
            class AIter{
            public:
                AIter(T
            * p=0):ptr(p){};
                T
            * ptr;
                typedef T value_type;
                T
            & operator*()const{
                    
            return *ptr;
                }
                T
            * operator->()const{
                    
            return ptr;
                }
            };
            template
            <typename T>
            typename T::value_type
            func(T val){
                
            return *val;
            }

            這方法一個(gè)缺陷就是對(duì)于不是class type的類型無能為力,比如原生指針,只有class type類型才能內(nèi)嵌類型

            改進(jìn)--模板偏特化(template partial specialization)
            聲明一個(gè)類型
            template<typename T>
            struct stl_iterator_traits{
                typedef typename T::value_type value_type;
            };
            原先的func可以寫成這樣
            template<typename T>
            typename stl_iterator_traits<T>::value_type
            func(T val){
                return *val;
            }
            這樣還是處理不了
            int* p=new int(3);
            func(p);
            原生指針類型,為其提供特化版本
            template<typename T>
            struct stl_iterator_traits<T*>{
                typedef T value_type;
            };
            這樣就能完美解決剛才問題

            但是對(duì)于指向常數(shù)對(duì)象的指針
            stl_iterator_traits<const int*>::value_type
            我們希望暫時(shí)存儲(chǔ)一個(gè)變量,但是我們獲取的類型是const int,聲明一個(gè)無法賦值的臨時(shí)變量無意義,所以我們?cè)谔峁┮粋€(gè)特化版本
            template<typename T>
            struct stl_iterator_traits<const T*>{
                typedef T value_type;
            };
            iterator example:
            #include <iterator>
            //#using <mscorlib.dll>
            #include <iostream>
            #include 
            <memory>
            #include 
            <vector>
            #include 
            <algorithm>
            //using namespace System;
            using namespace std;

            template
            <typename T>
            class ListItem{
            public:
                ListItem(T value){
                    _value
            =value;
                    _next
            =NULL;
                }
                ListItem(){
                    _next
            =NULL;
                    _value
            =0;
                }
                T value()
            const{
                    
            return _value;
                }
                ListItem
            <T>* _next;
                T _value;    
            };
            template
            <class Item>
            class ListIter:public iterator<std::forward_iterator_tag,Item>{
            public:
                Item
            * ptr;
                ListIter(Item
            * p=0):ptr(p){};
                Item
            & operator*()const{
                    
            return *ptr;
                }
                Item
            * operator->()const{
                    
            return ptr;
                }
                ListIter
            & operator++(){
                    ptr
            =ptr->_next;
                    
            return *this;
                }
                ListIter 
            operator++(int){
                    ListIter tmp
            =*this;
                    
            ++(*this);
                    
            return tmp;
                }
                
            bool operator==(const ListIter& iter)const{
                    
            return ptr==iter.ptr;
                }
                
            bool operator!=(const ListIter& iter)const{
                    
            return ptr!=iter.ptr;
                }
            };
            template
            <typename T>
            bool operator==(ListItem<T>& item,T value){
                
            return item.value()==value;
            }

            template
            <typename T>
            class List{
            public:
                typedef ListIter
            <ListItem<T> > iterator;
                List(){
                    _end
            =new ListItem<T>();
                    _front
            =0;
                }
                
            void insert_front(T value){
                    ListItem
            <T>* item=new ListItem<T>(value);
                    
            if(empty()){
                        item
            ->_next=_end;
                        _front
            =item;
                    }
            else{
                        item
            ->_next=_front;
                        _front
            =item;
                    }
                };
                
            bool empty(){
                    
            return _front==NULL;
                }
                
            void insert_end(T value){
                    
            //ListItem<T>* item=new ListItem<T>(value);
                    if(empty()){
                        _front
            =_end;
                        _end
            ->_value=value;
                        _end
            ->_next=new ListItem<T>();
                        _end
            =_end->_next;
                    }
            else{
                        _end
            ->_value=value;
                        _end
            ->_next=new ListItem<T>();
                        _end
            =_end->_next;
                    }
                };
                
            void display(ostream& os=cout){
                    ListItem
            <T>* head=_front;
                    
            while(head!=_end){
                        cout
            <<head->value()<<endl;
                        head
            =head->_next;
                    }
                };
                ListItem
            <T>* front(){
                    
            return _front;
                }
            private:
                ListItem
            <T>* _end;
                ListItem
            <T>* _front;
                
            long _size;
            };

            template
            <typename T>
            struct stl_iterator_traits{
                typedef typename T::value_type value_type;
            };

            template
            <typename T>
            struct stl_iterator_traits<T*>{
                typedef T value_type;
            };

            template
            <typename T>
            class AIter{
            public:
                AIter(T
            * p=0):ptr(p){};
                T
            * ptr;
                typedef T value_type;
                T
            & operator*()const{
                    
            return *ptr;
                }
                T
            * operator->()const{
                    
            return ptr;
                }
            };
            template
            <typename T>
            typename stl_iterator_traits
            <T>::value_type
            func(T val){
                
            return *val;
            }
            int _tmain(int argc, _TCHAR* argv[])
            {
                List
            <int> list;
                
            for(int i=0;i<5;i++){
                    list.insert_front(i);
                    list.insert_end(i
            +2);
                }
                list.display();
                
                
                List
            <int>::iterator begin(list.front());
                List
            <int>::iterator end;
                List
            <int>::iterator iter;

                
            //vector<int>::iterator itere;
                AIter<int> it(new int(2));
                
                iter
            =find(begin,end,2);
                cout
            <<iter->value()<<endl;
                
            //list.insert_end(1);
                
            //list.insert_end(2);
                
            //list.display();
                
            //list.insert_end(
                return 0;
            }

            現(xiàn)在對(duì)于class type 迭代器AIter,還是原生指針int* 或const int*,都能獲取正確類型int
            stl規(guī)定,每個(gè)迭代器都要自己內(nèi)嵌型別定義的方式定義出相應(yīng)型別
            (待續(xù)...)
            posted on 2010-10-09 13:23 小果子 閱讀(232) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++
            成人国内精品久久久久影院| 久久午夜无码鲁丝片| 国产精品女同久久久久电影院| 色妞色综合久久夜夜| 亚洲国产另类久久久精品小说| 精品久久亚洲中文无码| 国产精品久久久久久福利漫画| 色综合久久88色综合天天 | 99久久国产主播综合精品| 国产亚洲欧美精品久久久| 精品久久久久久久久午夜福利| 91久久福利国产成人精品| 日日狠狠久久偷偷色综合0| 99精品久久久久久久婷婷| 国产亚洲精品自在久久| 亚洲精品无码久久久久去q| 94久久国产乱子伦精品免费| 久久99这里只有精品国产| 91精品国产91久久久久久青草 | 久久精品桃花综合| 国内精品久久久久久久影视麻豆| 欧洲成人午夜精品无码区久久| 国产叼嘿久久精品久久| 91精品日韩人妻无码久久不卡| 99久久婷婷免费国产综合精品| 亚洲国产成人乱码精品女人久久久不卡| 99久久婷婷国产综合精品草原| 久久九九青青国产精品| 久久99精品九九九久久婷婷| 久久高潮一级毛片免费| 久久久久久久波多野结衣高潮 | 国产成人久久精品激情| 亚洲国产二区三区久久| 尹人香蕉久久99天天拍| 99久久免费国产精品热| 国产精品九九久久精品女同亚洲欧美日韩综合区| 亚洲精品综合久久| 97精品国产97久久久久久免费| 久久亚洲精品无码aⅴ大香| 丁香狠狠色婷婷久久综合| 日韩va亚洲va欧美va久久|