stl源码剖析-迭代器概念与traits编程技法

  STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一帖胶着剂将它们撮合在一起。 这帖胶着剂就是接下来要介绍的迭代器。算法是通过迭代器来对容器进行操作的。

迭代器是一种智能指针

  迭代器是一种行为类似指针的对象(智能指针),其最重要的工作就是对opperator* 和 operator->的重载

  在算法运用迭代器的时候,可能会用到其相应的型别,例如返回值为容器中元素的型别,又或者说根据迭代器的类型来选择更好的算法等等。

  为了获得迭代器所指对象的型别,一种是利用了function template的参数推导机制,例如:

template <class I,class T>
void func_impl(I iter,T t)
{
    T tmp;    //T就是迭代器所指之物的型别
    //。。。完成func()应该做的全部工作。
}
 
template <class I>
void func(I iter)
{
    func_impl(iter,*iter);    //func的工作全部移往func_impl
}
 
int main()
{
    int i=100;
    func(&i);

}

  我们以func()为对外接口,却把实际操作全部置于func_impl()之中,由于func_impl是一个function template,一旦被调用,编译器就会自动进行template参数推导,导出型别T,解决了问题。

 

Traits编程技法

  关于traits技法的理解可以参考这篇博文https://blog.csdn.net/qq100440110/article/details/51854673

  迭代器所指对象型别,称为该迭代器的value type。上述参数型别推导的技巧虽然可以用于value type,但却非全面可用:万一value必须用于函数的传回值,将束手无策了,毕竟函数的 template参数推导机制 只能推导参数,无法推导函数的返回值型别。

  Traits技法采用内嵌型别来实现获取迭代器型别这一功能需求,其意义是,如果I定义有自己的value type,那么通过这个traits的作用,萃取出来的value_type就是I::value_type。最常用的五种迭代器型别:value_type、difference_type、pointer、reference、iterator_category,

struct iterator_traits
{
    typedef typename I::iterator_category  iterator_category;
    typedef typename I::value_type         value_type;
    typedef typename I::difference_type    difference_type;
    typedef typename I::pointer            pointer;
    typedef typename I::reference          reference;

}

  value_type:value_type是指迭代器所指对象的类型。

  difference_type:用来表示两个迭代器之间的距离。

  reference type与pointer type

stl源码剖析-迭代器概念与traits编程技法

  iterator_category:迭代器的分类:input_iterator:只读只支持++操作。output_iterator:只写,只支持++操作。Forward_iterator:允许写入,在迭代器所形成的区间上进行读写操作,只支持++操作。Bidirectional_iterator:支持双向移动,支持++,–操作。Random Access iterator:支持所有的指针操作,随机访问,功能最强大。

 

上一篇:特质列表处理程序不响应=列表扩展


下一篇:SGI-STL简记(九)-字符串(string/wstring)