C++实战项目TinySTL之五:iterator.h

最近看了《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_

猜你喜欢

转载自blog.csdn.net/weixin_44537258/article/details/115110731