最近看了《STL源码剖析》和侯捷老师的STL课程,打算做一个小型的STL,在增加项目经验的同时也顺带复习STL和数据结构相关的知识。整个系列完全参考岚岚路的博客和github上的一个STL项目项目地址
任务
traits就像一台特性萃取机,榨取各个迭代器的相应型别,常用的迭代器型别有五种:value type,difference type,pointer,reference,iterator_category.uu
#ifndef _ITEARATOR_H_
#define _ITEARATOR_H_
#include<stddef.h>
namespace mySTL {
struct input_iterator_tag {
};//只读且读后往后移动
struct output_iterator_tag {
};//只写且写后往后移动
struct forward_iterator_tag :public input_iterator_tag {
};//可以从前往后遍历的指针
struct bidirectional_iterator_tag : public forward_iterator_tag {
};//从两个方向都可以遍历的指针
struct random_access_iterator_tag : public bidirectional_iterator_tag {
};//提供和指针相同的功能,换而言之它可以跳跃而不是逐个遍历
template <class T, class Distance> struct input_iterator
{
typedef input_iterator_tag iterator_category;//迭代器的类型
typedef T value_type;//迭代器所指对象的类别
typedef Distance difference_type;//两个迭代器的距离
typedef T* pointer;
typedef T& reference;
};
struct output_iterator
{
typedef output_iterator_tag iterator_category;
typedef void value_type;
typedef void difference_type;
typedef void pointer;
typedef void reference;
};
template <class T, class Distance> struct forward_iterator
{
typedef forward_iterator_tag iterator_category;
typedef T value_type;
typedef Distance difference_type;
typedef T* pointer;
typedef T& reference;
};
template <class T, class Distance> struct bidirectional_iterator
{
typedef bidirectional_iterator_tag iterator_category;
typedef T value_type;
typedef Distance difference_type;
typedef T* pointer;
typedef T& reference;
};
template <class T, class Distance> struct random_access_iterator
{
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef Distance difference_type;
typedef T* pointer;
typedef T& reference;
};
template<class Category, class T, class Distance = ptrdiff_t,
class Pointer = T * , class Reference = T & >
struct iterator
{
typedef Category iterator_category;
typedef T value_type;
typedef Distance difference_type;
typedef T* pointer;
typedef T& reference;
};
template<class Iterator>
struct iterator_traits
{
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
};
//定义T*偏特化版本
template<class T>
struct iterator_traits<T*>
{
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
};
template<class T>
struct iterator_traits<const T*>
{
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
};
//以下三条函数均使用强制转型提取iterator中的元素
template<class Iterator>
inline typename iterator_traits<Iterator>::iterator_category
iterator_category(const Iterator& It) {
typedef typename iterator_traits<Iterator>::iterator_category category;
return category();
}
template<class Iterator>
inline typename iterator_traits<Iterator>::value_type*
value_type(const Iterator& It) {
return static_cast<typename iterator_traits<Iterator>::value_type*>(0);
}
template<class Iterator>
inline typename iterator_traits<Iterator>::diffence_type*
diffence_type(const Iterator& It) {
return static_cast<typename iterator_traits<Iterator>::diffence_type*>(0);
}
}
#endif // !_ITEARATOR_H_