萃取机:iterator_traits

  • 结论:算法看不到容器,它所需的信息来源于迭代器;算法通常需要传入一个操作范围,而iterator_traits就是无论传入算法的是某种容器迭代器class还是原始指针,都能正确的获得各种类型声明,供算法使用

  • traits有很多种:type traits,iterator traits,char traits,alloctor traits,array traits,下面以iterator_traits举例:
    STL的每种容器迭代器class都包含5个typedef,以便算法使用,下面以value_type举例。当一个算法需要知道 I 的value_type时:

template<typanema I,...>
void algorithm {
	//例如I是list_iterator class,而list_iterator class中能找到该类型迭代器的value_type对应什么类型
	typedef I::value_type value_type; //当I是T*或const T*时,找不到对应的value_type
	//但如果I是普通指针,而不是某种容器的迭代器class,自然就没法找到对应的value_type的typedef
	//为了满足这两种情况,设计一个iterator_traits class,根据传入的是list_iterator类型还是指针类型,调用对应的版本,得到对应的value_type
	typename iterator_traits<I>::value_type v1;//根据传入萃取机的I的类型,调用不同版本
}

萃取机:Iterator_traits

//泛化版本
template<class I>
struct iterator_traits {//传入的是某种容器的迭代器class,进入这个版本
	typedef typename I::value_type value_type;
}
//两个偏特化版本
template<class T>
struct iterator_traits<T*> {//传入T*,进入该版本
	typedef T value_type;
}
template<class T>
struct iterator_traits<const T*> {//传入const T*,进入该版本
	typedef T value_type;
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值