er; } } else//当n小于0时,向前移 { while(n++) { --iter; } } } //定义随机访问迭代器移动的方法 template
inline void _advance(RandomAccessIterator &iter,Distance n, random_access_iterator_tag) { iter+=n; } //自适应的调用advance函数 template
inline void advance(InputIterator &iter,Distance n) { _advance(i,n,iterator_catetory(iter)); }
从上面的代码中不难发现,实现一个迭代器,需要做一下工作:
1.定义5类迭代器的标志类,该标志类用于实现函数的区别调用(即重载),例如求两迭代器距离函数distance(iter1,iter2,tag),移动函数advance(iter,n,tag)。这五个标志类分别为:input_iterator_tag,output_iterator_tag,forward_iterator_tag,bidirectional_iterator_tag,random_access_iterator_tag。
2.对于每一个iterator类,都必须包含5个属性,分别为:iterator_category、value_type、difference_type、pointer、reference。
3.定义一个迭代器的“属性榨汁机”iterator_traits,用于获取iterator的5中属性值。
4.定义迭代器的操作,分别为:
1) 获取iterator的标志----->iterator_category(iter);
2)获取两迭代器差值的类型----->distance_type(iter);
3)获取迭代器的原始类型--------->value_type(iter);
4)求两迭代器的距离---------------->distance(iter1,iter2,tag);
5)将迭代器移动n位------------------>advance(iter,n,tag)。
参考文献:
[1]《C++ Primer中文版 第4版》
[2]《STL源码剖析 侯捷》