[vs 2005]_Iter_cat

 返回指定类型的迭代器种类:

// xutility 757
template<class _Iter> inline
typename iterator_traits<_Iter>::iterator_category _Iter_cat(const _Iter&)
{	// return category from iterator argument
	typename iterator_traits<_Iter>::iterator_category _Cat;
	return (_Cat);
}

模板iterator_traits有一个普通版本和三种特化版本:

// 普通版本,通过_Iter自己定义的iterator_category来获取迭代器种类
template<class _Iter>
struct iterator_traits
{	// get traits from iterator _Iter
	typedef typename _Iter::iterator_category iterator_category;
	typedef typename _Iter::value_type value_type;
	typedef typename _Iter::difference_type difference_type;
	typedef typename _Iter::pointer pointer;
	typedef typename _Iter::reference reference;
};

// 针对指针的特化
template<class _Ty>
struct iterator_traits<_Ty *>
{	// get traits from pointer
	typedef random_access_iterator_tag iterator_category;
	typedef _Ty value_type;
	typedef ptrdiff_t difference_type;
	typedef ptrdiff_t distance_type;	// retained
	typedef _Ty *pointer;
	typedef _Ty& reference;
};

template<class _Ty>
struct iterator_traits<const _Ty *>
{	// get traits from const pointer
	typedef random_access_iterator_tag iterator_category;
	typedef _Ty value_type;
	typedef ptrdiff_t difference_type;
	typedef ptrdiff_t distance_type;	// retained
	typedef const _Ty *pointer;
	typedef const _Ty& reference;
};

// 对所有的内置类型都有特化,在此略过。
template<> struct iterator_traits<_Bool>
{	// get traits from integer type
	typedef _Int_iterator_tag iterator_category;
	typedef _Bool value_type;
	typedef _Bool difference_type;
	typedef _Bool distance_type;
	typedef _Bool * pointer;
	typedef _Bool & reference;
};

template<> struct iterator_traits<float>
{
	typedef _Float_iterator_tag iterator_category;
	typedef float value_type;
	typedef float difference_type;
	typedef float distance_type;	
	typedef float * pointer;
	typedef float& reference;
};

迭代器种类可能取值:

// vs 2005中迭代器种类有以下几种:
struct input_iterator_tag
{	// identifying tag for input iterators
};

struct output_iterator_tag
{	// identifying tag for output iterators
};

struct forward_iterator_tag
	: public input_iterator_tag
{	// identifying tag for forward iterators
};

struct bidirectional_iterator_tag
	: public forward_iterator_tag
{	// identifying tag for bidirectional iterators
};

struct random_access_iterator_tag
	: public bidirectional_iterator_tag
{	// identifying tag for random-access iterators
};

// 前面几种是STL共有类型,而下面两种应该是VS 2005这种实现特有的
// 下面这两个类型使iterator_traits不仅能够获取迭代器特性,也能获取
// 系统内置数据类型的各种特性。
struct _Int_iterator_tag
{	// identifying tag for integer types, not an iterator
};

struct _Float_iterator_tag
{	// identifying tag for floating point types, not an iterator
};



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值