您的位置:首页 > 大数据 > 人工智能

STL-迭代器与traits技法

2017-07-08 20:42 260 查看

迭代器

在设计模式中,迭代器模式定义为:提供一种方法,使之能够依序巡防某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达式

在STL中,迭代器把数据容器算法撮合在一起,扮演了粘合剂的作用。

它的基本用法是:

vector<int> v; (vector/deque/list...)
vector<int>::iterator it=v.begin()


从上面的例子看出迭代器是一个行为类似指针的对象,迭代器最重要的编程工作就是对operator*和operator->进行重载工作。

Traits编程技法

当函数,类或者一些封装的通用算法中的某些部分会因为数据类型不同而导致处理或逻辑不同(而我们又不希望因为数据类型的差异而修改算法本身的封装时),traits会是一种很好的解决方案。traits可以理解为特性

迭代器所指对象的型别,称为该迭代器的value type。在《STL源码剖析》中有这张图:



图中说明了traits,萃取了各个迭代器的特性(迭代器型别),最常用到的型别有五种:

value type

different type

pointer

reference

iterator category

value type

指迭代器所指对象的型别

different type

表示两个迭代器之间的距离

reference type

表示迭代器所指对象是否允许改变

pointer type

传回的对象?

iterator_category

根据移动特性与施行操作,迭代器被分为五类:

Input Iterator:只读

Output Intertor:只写

Forward Iterator:允许”写入型”算法在此种迭代器形成的区间上进行读写操作

Bidirectional Iterator:可双向移动。

Random Access Iterator:涵盖所有指针算术能力(+,-,[],<…)

从属关系:



Ex:distance()为例,用于计算两个迭代器的距离。针对不同的迭代器,可以有不用的计算方式,带来不同的效率。

template<class InputIterator>
inline iterator_traits<InputIterator>::different_type
_distance(InputIterator first,InputIterator last,input_iterator_tag){
iterator_traits<InputIterator>::different_type n=0;
//逐一累计距离
while(first != last){
++first;++n;
}
return n;
}

template<class RandomAccessIterator>
inline iterator_traits<RandomAccessIterator>::different_type
_distance(RandomAccessIterator first,RandomAccessIterator last,random_access_iterator_tag){
//直接计算差距
return last-first;
}

template <class InputIterator>
inline iterator_traits<InputIterator>::difference_type
distance(InputIterator first,InputIterator last){
typedef typename iterator_traits<InputIterator>::iterator_category category;

return _distance(first,last,category());
}


distance()可接受任何类型的迭代器,Forward Iterators或Bidirectional Iterators时,统统都会传递调用Input Iterator版的那个 _distance()函数。

参考资料

《STL源码剖析》

神奇的Traits
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: