31

私はC++が初めてなので、ご容赦ください。STL を理解しようとしていますiterator_traits。本「The C++ Standard Library」では、構造iterator_traitsは次のように定義されています。

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

Tしたがって、すでに公開されているサブタイプを再公開しているように思えます。さらに先に進むと、本はそれを使用する方法の例を示しています。これは次のようなものです。

template <class MyIterator>
void do_something(MyIterator start, MyIterator end) {
    typedef typename iterator_traits<MyIterator>::value_type value_type; 
    value_type v = *start;
    .....
}

私の質問は、なぜiterator_traitsここでこの構造が必要なのかというvalue_typeことMyIteratorです. 私の混乱は、サブタイプの情報template <class T>iterator_trait. したがって、できれば例を挙げて説明できれば、非常に役立つ iterator_traits が必要な理由と場所を教えてください。

4

1 に答える 1

29

配列へのポインターは、ランダム アクセス反復子として使用できます。

ポインター (ネストされた型を持つことができるのはクラスのみであるため、明らかに型をネストされた型として宣言することはできません) とクラス型反復子の両方に対して、これらの型を取得する一貫した方法が必要です。traits クラス テンプレートは、この一貫した方法を提供します。

クラス テンプレートは、次のiterator_traitsようなポインターに特化しています。

template <typename T>
struct iterator_traits<T*>
{
    typedef std::random_access_iterator_tag iterator_category;
    typedef T                               value_type;
    typedef T*                              pointer;
    typedef T&                              reference;
    typedef std::ptrdiff_t                  difference_type;
};
于 2011-07-19T03:34:06.990 に答える