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