您好,登錄后才能下訂單哦!
#pragma once struct InputIteratorTag {}; struct OutputIteratorTag {}; struct ForwardIteratorTag : public InputIteratorTag {}; struct BidirectionalIteratorTag : public ForwardIteratorTag {}; struct RandomAccessIteratorTag : public BidirectionalIteratorTag {}; template<class T> struct InputIterator { //typedef T ValueType; //typedef Distance DifferenceType; //typedef T* Pointer; //typedef T& Reference; typedef InputIteratorTag IteratorCategory; //迭代器的類型 ( 包括上面那5個struct ) }; template<class Iterator> struct IteratorTraits { //typedef typename Iterator::ValueType ValueType; //typedef typename Iterator::DifferenceType DifferenceType; //typedef typename Iterator::Pointer Pointer; //typedef typename Iterator::Reference Reference; typedef typename InputIterator<Iterator>::IteratorCategory IteratorCategory; }; template<class T> struct IteratorTraits<T*> //內置類型的特化版本 { typedef RandomAccessIteratorTag IteratorCategory; }; template <class InputIterator> inline size_t Distance(InputIterator first, InputIterator last) { return _Distance(first, last, IteratorTraits<InputIterator>::IteratorCategory() ); //這里第三個參數 并沒有實際意義,不過正是它的存在,讓_Distance實現重載 } template <class InputIterator> inline size_t _Distance(InputIterator first, InputIterator last, RandomAccessIteratorTag) { return last - first; } template <class InputIterator> inline size_t _Distance(InputIterator first, InputIterator last, InputIteratorTag) { size_t n = 0; while (first != last) { ++first; ++n; } return n; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。