C++ STL源码剖析之实现一个简单的iterator_category
本节使用上节Traits特性,研究iterator源码,来实现一个简单的iterator_category,同时对iterator的源码结构进行分析。
试读章节 · 登录解锁全文
1.5 小时
C++ STL源码剖析之实现一个简单的iterator_category
0.导语
本节使用上节Traits特性,研究iterator源码,来实现一个简单的iterator_category,同时对iterator的源码结构进行分析。
知其然,知其所以然,源码面前了无秘密!
1.利用萃取机实现一个简单的iterator_category识别
上一节指出了迭代器的作用,依旧如下图所示:

迭代器是指向序列元素的指针的一种抽象。通过使用迭代器,我们可以访问序列中的某个元素、改变序列中的某个元素的值、使迭代器向前或向后行走等等。
迭代器有常见有五种类型: value_type, difference_type, reference_type, pointer_type都比较容易在 traits 和相应偏特化中提取。
但是,iterator_category一般也有5个,这个相应型别会引发较大规模的写代码工程。
- 单向移动只读迭代器 Input Iterator
- 单向移动只写迭代器 Output Iterator
- 单向移动读写迭代器 Forward Iterator
- 双向移动读写迭代器 Bidirectional Iterator

例如:我们实现了 advanceII, advanceBI, advanceRAI 分别代表迭代器类型是Input Iterator,Bidirectional Iterator和Random Access Iterator的对应实现。
template<class Iterator>
void advance(Iterator& i) {
if (is_random_access_iterator(i))
advanceRAI(i,n);
if (is_bidirectional_iterator(i))
advanceBI(i,n);
else
advanceII(i,n);
}
但这样在执行时期才决定使用哪一个版本,会影响程序效率。最好能够在编译期就选择正确的版本。
而重载这个函数机制可以达成这个目标。
而对于advanceXX()都有两个函数参数,型别都未定(因
…