乍看起来,STL 迭代器的概念似乎已经非常简单了,然而再仔细看一看,你就会注意到,STL 标准容器实际上提供了 4 种不同的迭代器类型:iterator、const_iterator、reverse_iterator 和 const_reverse_iterator。再进一步你会注意到,对于特定的形式的 insert 和 erase 函数,4 种类型中只有一种迭代器可以被容器接受。问题来了:为什么需要 4 种不同的迭代器呢?它们之间有什么关系?它们是否可以相互转换?是否可以在 STL 算法和其他工具函数中混合使用不同类型的迭代器?这些迭代器与相应的容器及其成员函数之间又是什么关系呢?
本章旨在寻求上述问题的答案,并且将介绍一种在实践中没有得到足够关注的迭代器类型:istreambuf_iterator。如果你喜欢使用 STL,却对使用 istream_iterator 读取字符流的性能不很满意,那么 istreambuf_iterator 正是你所需要的工具。
第26条:iterator 优先于 const_iterator、reverse_iterator、const_reverse_iterator
有些版本的 insert 和 erase 函数要求使用 iterator。如果你需要调用这些函数,那么就必须使用 iterator。const 和 reverse 型的迭代器已经不能满足这些函数的要求。
要想隐式地讲一个 const_iterator 转换为 iterator 是不可能的,就算使用 const_iterator 转换成 iterator 的技术并不普遍使用,而且效率也不能保证。
从 reverse_iterator 转换而来的 iterator 在使用之前可能需要相应的调整。
第27条:使用 distance 和 advance 将容器的 const_iterator 转换成 iterator
要想让 distance 调用顺利地通过编译,需要排除二义性。最简单的办法是显式地指明 distance 所使用的类型参数,从而避免让编译器来推断该类型参数。
第28条:正确理解 reverse_iterator 的 base() 成员函数所产生的 iterator 的用法
通过 base() 函数可以得到一个与 reverse_iterator “相对应的” iterator 的说法并不准确。
对于插入操作,这种对应关系确实存在。但对于删除操作,情况却并非如此简单。
第29条:对于逐个字符的输入请考虑使用 istreambuf_iterator
如果你需要从一个输入流中逐个读取字符,那么就不必使用格式化输入;如果你关心的是读取流的时间开销,那么使用 istreambuf_iterator 取代 istream_iterator 只是多输入了三个字符,却可以获得明显的性能改善。对于非格式化的逐个字符输入过程,你总是就应该考虑使用 istreambuf_iterator。
同样地,对于非格式化的逐个字符输出过程,你也应该考虑使用 ostreambuf_iterator。它可以避免因使用 ostream_iterator 而带来的额外负担,从而具有更为优越的性能。