Boolan C++ 第九周 iterator_traits的使用

當(dāng)算法傳入迭代器參數(shù)的時候,算法需要迭代器的一些類型數(shù)據(jù),所以萃取器就代替迭代器對算法做出響應(yīng)

template<typename _ForwardIterator>
inline void
rotate(_ForwardIterator __first,
        _ForwardIterator __middle,
        _ForwardIterator __last)
        {
            ...
            std::__rotate(__first,__middle,__last,
                        std::_iterator_category(_first));//__rotate,是內(nèi)部實(shí)現(xiàn)的函數(shù)
        }

實(shí)際的調(diào)用需要知道迭代器的類型,所以算法需要迭代器萃取器做出回應(yīng),返回迭代器類型

template<typename _Iter>
inline typename iterator_traits<_Iter>::iterator_category
    _iterator_category(const _Iter&)
    {
        return typename iterator_traits<_Iter>::iterator_category;
    }

通過迭代器生成iterator_traits<iterator>,可以獲得迭代器五個associated types

//list 的迭代器 assoatied types
template<typename _Tp>
struct _List_iterator
{
    typedef std::didirectional_iterator_tag iterator_category;
    typedef _Tp         value_type;
    typedef _Tp*        pointer;
    typedef _Tp&        reference;
    typedef ptrdiff_t   difference_type;
};

但是對于萃取器來說,若是連續(xù)空間存儲的容器,內(nèi)部的迭代器和普通類型的指針是相同的,所以萃取器對于傳入普通指針也需要相應(yīng)的轉(zhuǎn)換,但是不同的是迭代器是一種class,而普通指針只是一種普通指針,所以萃取器會使用到偏特化(partial specialization)

template<calss T>
struct iterator_traits
{
    typedef typename T::value_type          value_type;   
    typedef typename T::difference_type     difference_type 
    typedef typename T:pointer              pointer
    typedef typename T::reference           reference
    typedef typename T::iterator_category   iterator_category
};

template<class T>
struct iterator_traits<T*>  //native pointer的偏特化
{
    typedef T                               value_type;
    typedef std::ptrdiff_t                  difference_type
    typedef T*                              pointer
    typedef T&                              reference
    typedef std::random_access_iterator_tag iterator_category

};

template<class T>
struct iterator_traits<const T*> //const native pointer的偏特化
{
    typedef T                               value_type;
    typedef std::ptrdiff_t                  difference_type
    typedef T*                              pointer
    typedef T&                              reference
    typedef std::random_access_iterator_tag iterator_category
};

此處const T *的value_type不是 const T,而是 T,是因?yàn)槲覀冃枰獀alue_type聲明變量,若是常量變量則無法賦值,所以必須使用非常量變量。
所以不管是迭代器還是普通指針,都可以通過萃取器獲得associated types,所以提供給算法的接口就是一致的(這也是范式編程的思想)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容