Iterator_Traits

  1. Iterator需要遵循的原则
  2. iterator的相关类型
  3. traits
  4. 各种各样的traits

Iterator需要遵循的原则

  • iterator是算法和容器之间的桥梁
  • iterator必须有能力回答algorithm的提问
    • 总共有5中iterator的相关类型: iterator_category,value_type,pointer,reference,difference_type

iterator的相关类型

traits

  • 迭代器的5个关联类型在类中均有定义,但是指针类型的关联类型需要根据指针类别进行确定,为了使STL算法同时兼容迭代器和一般指针,就在迭代器(指针)和算法之间加一个中间层萃取器(traits).
  • 迭代器萃取器iterator_traits的目的就是能够兼容迭代器和一般指针,获取其5个关联类型:iterator_category、value_type、difference_type、pointer和pointer.
    • 就是这个traits能够分别它所获得的iterator是(1)class iterator T或是(2)native pointer to T.
    • 利用parital specialization可达到目标.


  • 在实现上,iterator_traits类使用模板的偏特化(范围上),对于一般的迭代器类型,直接取迭代器内部定义的关联类型;对于指针和常量指针进行偏特化,指定关联类型的值.
    ```cpp
    // 针对一般的迭代器类型,直接取迭代器内定义的关联类型
    template
    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 reference;
    };

// 针对指针类型进行特化,指定关联类型的值
template
struct iterator_traits {
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
};

// 针对指针常量类型进行特化,指定关联类型的值
template
struct iterator_traits {
typedef random_access_iterator_tag iterator_category;
typedef T value_type; // value_tye被用于声明变量,而声明一个无法被赋值的变量没什么用,
// 所以iterator的value type不应该加上const
typedef ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
};

* 想要在算法内获取关联类型的值,只需像下面这样写:

```cpp
template<typename T>
void algorithm(...) {
    typename iterator_traits<I>::value_type v1;
}

各种各样的traits

  • type traits
  • iterator traits
  • char traits
  • allocator traits
  • pointer traits
  • array traits