STLの6大コンポーネントの反復器とtraits技術

3296 ワード

反復器は容器とアルゴリズムに関連する重要な部品(接着剤)であり、反復器を設計するには対応する容器の実現の詳細を理解する必要があり、これらの詳細を隠すためにSTLは各容器に独自の反復器を提供している.
これらの反復器は、++,--,=,!=などの容器に対する様々な操作を実現する必要がある.など.
汎用アルゴリズム、例えばfindを使用する場合、find内では、反復器の対応する型別(合計5種類:1で指す物のタイプ、②反復器のタイプ、③ポインタのタイプ、④参照のタイプ、⑤差のタイプ)を使用する必要があります.組み込みカテゴリを宣言すると、反復器の対応するカテゴリが取得されますが、オリジナルポインタでは適用されません.従って,抽出技術を用いて対応する型別を取得し,偏特化により原生ポインタの関連型情報も取得できるようにした.
//       :
struct input_iterator_tag  {};  //  
struct output_iterator_tag  {};   //  
struct forward_iterator_tag : public input_iterator_tag,output_iterator_tag {};  //        
struct bidirectional_iterator_tag : public forward_iterator_tag  {};  //  
struct random_access_iterator_tag : public bidirectional_iterator_tag  {};   //  
//     
template  
    struct iterator{
    typedef Category    iterator_category;
    typedef T           value_type;
    typedef Distance     difference;
    typedef Pointer      pointer;
    typedef Reference    reference;
};
//mylist   :                     
template
class ListIter : public std::iterator<:forward_iterator_tag>
{
	……
};
//“   ”
template   // I        
struct iterator_traits{
	typedef typename I::iterator_category iterator_category;
	typedef typename I::value_type      value_type;
	typedef typename I:;difference_type  difference_type;
	typedef typename I::pointer         pointer;
	typedef typename I::reference       referencr;
};
//            “   ”
template   // I        
struct iterator_traits{
	typedef random_access_iterator_tag  iterator_category;
	typedef T                         value_type;
	typedef ptrdiff_t                   difference_type;
	typedef T*                        pointer;
	typedef T&                       referencr;
};
//  const          “   ”
template   // I        
struct iterator_traits{
	typedef random_access_iterator_tag  iterator_category;
	typedef T                         value::type;
	typedef ptrdiff_t                   difference_type;
	typedef T*                        pointer;
	typedef T&                       referencr;
};
//                    (category)
template
inline typename iterator:_traits::iterator_category 
Iterator_category(const Iterator&){
	typename iterator_traits::iterator_category category;
	return category();
}
//advance    
template
inline void advance(InputIterator& i,Distance n)
{
	_advance(I,n,iterator_category(i));  //                  
}

       抽出技術は、汎用アルゴリズムに反復器によってこの反復器に関連するタイプを取得させることができる:例えば、反復器のタイプ、反復器が指すもののタイプ、反復器が指すものの参照タイプ、ポインタのタイプなど.
      たとえば、STLの解析関数ではfirstとlastの2つの反復器の間のすべてのオブジェクトを解析します.この範囲が広く、この構造関数は重要ではありません(要素にポインタタイプがない場合、構造関数は関係ありません).頻繁に構造関数を呼び出すのは意味がないので、私たちは何もしなくてもいいです.したがって、反復器が指す要素のタイプを知る必要があります.抽出技術は、反復器によって要素のタイプを導出する技術です.
     具体的な導出方法は、単純に言えば、各コンテナの反復器は、反復器タイプ、指す物タイプ、ポインタタイプ、参照タイプ、差分タイプなどを再命名します.このコンテナのこれらのタイプを同じ名前にし、オリジナルポインタも抽出できるようにするために、中間層抽出クラステンプレートを加え、反復器のこれらの関連タイプの名前を変更し直し、オリジナルポインタの関連タイプを偏特化します.これにより,汎用アルゴリズムでは反復器の対応する性別が得られる.