• STL 源代码剖析 算法 stl_numeric.h -- copy


    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


    copy

    //唯一对外接口
    /*--------------------------------------------------------------------------------------
    * copy 函数及其重载形式
    */
    //全然泛化版本号。 
    template<class InputIterator, class OutputIterator> // ? 这里的 InputIterator 和 OutputIterator 都仅仅是名称而已,哪里确保了它们真的至少是 InputIterator 和 OutputIterator ?
    inline OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result){
    // 不明确为什么要用 function object 实现,用普通的 function 实现不行吗?
    // 由于 function object 能够偏特化 ? 但普通的 function 也能够重载呀
    // 难道由于通过 function object 实现的偏特化是编译时多态。比 function 重载的执行时多态要好 ?
    return __copy_dispatch<InputIterator, OutputIterator>() (first, last, result); 
    }
    
    //针对原生指针(可视为一种特殊的迭代器) const char * 和 const wchar_t *, 进行内存直接拷贝操作
    //特殊版本号[1] 重载形式
    inline char *copy(const char* first, const char *last, char *result){
    memmove(result, first, last - first);
    return result + (last - first); //为什么要返回这种迭代器呢?
    }
    
    
    //特殊版本号[2] 重载形式
    inline wchar_t *copy(const wchar_t *first, const wchar_t *last, wchar_t *result){
    memmove(result, first, sizeof(wchar_t) * (last - first));
    return result + (last - first);
    }
    
    
    /*--------------------------------------------------------------------------------------
    * __copy_dispatch 及其偏特化版本号
    */
    //copy() 函数的泛化版本号中调用了一个 __copy_dispatch() 函数,此函数有一个泛化版本号和两个偏特化版本号
    //全然泛化版本号
    template<class InputIterator, class OutputIterator>
    struct __copy_dispatch{
    OutputIterator operator()(InputIterator first, InputIterator last, OutputIterator result){
    return __copy(first, last, result, iterator_category(first));
    }
    };
    
    //以下的两个偏特化版本号的參数为原生指针形式
    
    //偏特化版本号[1],两个參数都是T *指针形式
    template<class T>
    struct __copy_dispatch<T *, T*>
    {
    T *operator()(T *first, T *last, T *result){
    typedef typename __type_traits<T>::has_trivial_assignment_operator t;
    return __copy_t(first, last, result, t());
    }
    };
    
    
    //偏特化版本号[2]。第一个參数是 const T*指针形式,第二參数是 T *指针形式
    template<class T>
    struct __copy_dispatch<const T*, T*>
    {
    T *operator()(const T *first, const T *last, T *result){
    typedef typename __type_traits<T>::has_trivial_assignment_operator t;
    return __copy_t(first, last, result, t());
    }
    };
    
    
    /*--------------------------------------------------------------------------------------
    * 不同版本号的_copy 函数
    */
    // 以下的 InputIterator 版本号、 RandomAccessIter 版本号 中的 InputIterator 和 RandomAccessIter 都仅仅是名称而已,编译器怎么知道详细化哪个函数版本号? ?
    // --> 有个 input_iterator_tag 来确定迭代器的类型,从而使编译器能够知道该详细化哪个函数的版本号
    //InputIterator 版本号
    template<class InputIterator, class OutputIterator>
    inline OutputIterator __copy(InputIterator first, InputIterator last, OutputIterator result, input_iterator_tag){
    //假设仅仅是 InputIterator 的话。以迭代器赞同与否,决定循环是否继续、速度慢
    for( ; first != last; ++result, ++first)
    *result = *first;
    return result;
    }
    // RandomAccessIter 版本号
    template<class RandomAccessIter, class OutputIterator>
    inline OutputIterator __copy(RandomAccessIter first, RandomAccessIter last, OutputIterator result, random_access_iterator_tag){
    // 其它地方可能也会用到 __copy_d
    return __copy_d(first, last, result, distance_type(first));
    }
    
    
    template<class RandomAccessIter, class OutputIterator, class Distance>
    inline OutputIterator __copy_d(RandomAccessIter first, RandomAccessIter last, OutputIterator result, Distance *){
    // 以 n 决定循环的执行次数。速度快
    for(Distance n = last - first; n > 0; --n, ++result, ++first)
    *result = *first;
    return result;
    }
    
    
    /*--------------------------------------------------------------------------------------
    * 偏特化版本号使用的 copy_t 函数
    */
    //以下版本号适用于"指针所指之对象具备 trivial assignment operator"
    template<class T>
    inline T *__copy_t(const T* first, const T *last, T *result, __true_type){
    memmove(result, first, sizeof(T) * (last - first));
    return result + (last - first);
    }
    
    
    //以下版本号适用于"指针所指之对象具备 non-trivial assignment operator"
    template<class T>
    inline T *__copy_t(const T* first, const T *last, T *result, __false_type){
    return __copy_d(first, last, result, (ptrdiff_t *) 0); // 转而调用  __copy_d 
    }
    


  • 相关阅读:
    武汉招项目经理,高级软件工程师,客户端程序员,网页制作,2D美工[代发]
    学习WPF: 创建数据绑定目录树
    How do you translage CS2008 hardcode strings quickly?
    Windows Media Services 流媒体服务器架设教程 .
    流媒体服务器搭建实例——可实现录音,录像功能
    (转)A General Fast Method Invoker
    iphone property(转)
    C# 运算法 “??” “:: ” “int?”
    Crosby质量箴言(转)
    iphone程序的生命周期(执行过程) (转)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5072928.html
Copyright © 2020-2023  润新知