迭代器--摘自STL源码剖析


//myiterator
#ifndef _MYITERATOR
#define _MYITERATOR
//迭代器是一种智能指针
//首先利用继承关系定义五种迭代器类型
struct input_iterator_tag{};
struct out_put_tag{};
struct forward_iterator_tag:public input_iterator_tag{};
struct bidirectional_iterator_tag:public forward_iterator_tag{};
struct random_iterator_tag: public bidirectional_iterator_tag{};

//为了避免写代码时候漏写重要东西,自行开发的iterator最好继承以下iterator:
//每个iterator至少要提供以下五种信息:迭代器类型,所指对象型别,迭代器距离,
//所指对象的指针型及引用型
template<typename Category,typename T,typename Distance=ptrdiff_t,
	typename Pointer=T*,typename Reference=T&>
	struct iterator
	{
		typedef Category iterator_category;
		typedef T             value_type;
		typedef Distance   difference_type;
		typedef Pointer     pointer;
		typedef Reference reference;
	};
//每个iterator都应有traits来提供型别认证方面的能力
	template<typename 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;
	};
	//针对原生指针(native pointer)的traits的偏特化版本
	template<typename T>
	struct iterator_traits<T*>
	{
		typedef random_iterator_tag iterator_category;
		typedef T                              value_type;
		typedef ptrdiff_t                    difference_type;
		typedef T*                            pointer;
		typedef T&                            reference;
	};
	//针对原生的指向const的指针的偏特化:
	template<typename T>
	struct iterator_traits<const T*>
	{
		typedef random_iterator_tag iterator_category;
		typedef T                             value_type;
		typedef ptrdiff_t                   difference_type;
		typedef const T*                   pointer;
		typedef const T&                   reference;
	};
	//萃取迭代器类型的函数
	template<typename Iterator>
	inline typename iterator_traits<Iterator>::iterator_category
		iterator_category(const Iterator&)
	{
		typedef typename iterator_traits<Iterator>::iterator_category category;
		return category();
	}
//萃取迭代器difference_type类型的函数
	template<typename Iterator>
	inline typename iterator_traits<Iterator>::difference_type*
		distance_type(const Iterator&)
	{
		return static_cast<typename iterator_traits<Iterator>::difference_type*>(0) ;
	}
//萃取迭代器的value_type特性,返回的参数是指针,这样才能保证,得到的不是非常大的对象!
	template<typename Iterator>
	inline typename iterator_traits<Iterator>::value_type*
		value_type(const Iterator&)
	{
		return static_cast<typename iterator_traits<Iterator>::value_type*>(0) ;
	}
//---------------------------------------------------------------------------------------------
	//traits编程技法适度弥补了c++语言的不足,可以获得迭代器的信息,萃取迭代器特性;
	//__type_traits萃取型别的特性,获取型别是否具有non-trival 构造/析构/copy/赋值特性
	//如果没有的话,我们1可以采用最有效率的措施---内存直接处理操作;
	struct __true_type{};//表明trivial
	struct __false_type{};//表明non-trivial
	//这是最低保障,假设类型拥有non-triival的构造/析构/copy/赋值特性
	template<typename type>
	struct __type_traits
	{
		typedef __true_type this_dummy_member_must_be_first;
		/*他通知“有能力自动将__type_traits特化的”的编译器说,我们现在看到的
		 *__type_traits template 是特殊的。这是为了确保万一编译器也使用一个名为
		 *__type_traits时,仍然能正常运行
		 */
		typedef __false_type  has_trivial_default_constructor;
		typedef __false_type  has_trivial_copy_constructor;
		typedef __false_type  has_trivial_assignment_operator;
		typedef __false_type has_trivial_destructor;
		typedef __false_type  is_POD_type;
	};
	//以下为内置类型的特化
	template<>struct __type_traits<char>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<signed char>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<unsigned char>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<short>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<unsigned short>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<int>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<unsigned int>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<long>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<unsigned long>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<float>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<double>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	template<>struct __type_traits<long double>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
	//对原生指针偏特化
	template<typename T>
	struct __type_traits<T*>
	{
		typedef __true_type  has_trivial_default_constructor;
		typedef __true_type  has_trivial_copy_constructor;
		typedef __true_type  has_trivial_assignment_operator;
		typedef __true_type has_trivial_destructor;
		typedef __true_type  is_POD_type;
	};
#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值