STL源码(1)迭代器原理与萃取技术

一、迭代器概要

1.迭代器依附于容器,没有独立而泛用的迭代器

2.迭代器是一种smart pointer,迭代器最重要的编程工作是重载operator* 和operator ->

3.原生指针也是迭代器

4.设计适当的相应型别是迭代器的责任;设计适当的迭代器则是容器的责任

二、迭代器的相应型别

value type 所指对象型别
difference type 两个迭代器之间的距离
pointer 所指对象的指针型别
reference 引用型别
iterator catagoly 种类型别

三、迭代器的类型

对于STL数据结构和算法,你可以使用五种迭代器。下面简要说明了这五种类型:

Input iterators 提供对数据的只读访问。
Output iterators 提供对数据的只写访问
Forward iterators 提供读写操作,并能向前推进迭代器。
Bidirectional iterators 提供读写操作,并能向前和向后操作。
Random access iterators 提供读写操作,并能在数据中随机移动。

四、萃取技术(traits)

1.并非所有迭代器都是类类型(class type)。原生指针就不是。如果不是class type就无法定义内嵌型别。单STL必须接受原生指针为迭代器。

2.traits编程技法很棒,适度弥补了C++语言本身的不足。STL只对迭代器加以规范,制作出iterator_traits这样的东西。SGI STL把这种技法进一步扩大到迭代器以外的世界,于是有了所谓的__type_traits。双底线前缀表示SGI内部所用的东西,不在STL标准规范之内。

3.萃取类

Template <class I>
struct iterator_traits
{
	typedef typename I:value_type value_type;
}
偏特化版本(原生指针) -->原生指针会自动匹配到这个模板
Template <class T>
struct iterator_traits<T*>
{
	typedef  T value_type;
}
偏特化版本(pointer-to-const) -->const原生指针会自动匹配到这个模板
Template <class T>
struct iterator_traits<const T*>
{
	typedef  T value_type;
}


完整版萃取类

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; 
}; 

完整版偏特化之原生指针类型 -->原生指针会自动匹配到这个模板
template <class T> 
struct iterator_traits<T*> { 
  typedef random_access_iterator_tag iterator_category;     // 指针类型是可以随机访问的 
  typedef T value_type;                               // 值类型 
  typedef ptrdiff_t difference_type;    // 指针类型之间的距离一定是整型(ptrdiff_t被定义为int型) 
  typedef T* pointer; 
  typedef T& reference; 
}; 

完整版之pointer-to-const -->const原生指针会自动匹配到这个模板
template <class T> 
struct iterator_traits<const T*> { 
  typedef random_access_iterator_tag iterator_category;     // 指针类型是可以随机访问的 
  typedef T value_type;                              // 值类型 
  typedef ptrdiff_t difference_type;  // 指针类型之间的距离一定是整型(ptrdiff_t被定义为int型) 
  typedef T* pointer; 
  typedef T& reference; 
}; 








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值