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