Item 26:优先使用 iterator 而不是 const_iterator, reverse_iterator, const_reverse_iterator。
Item 27:使用 distance 和 advance 将 const_iterator 转换成 iterator。
Item 28:理解 reverse_iterator 的 base iterator。
Item 29:使用 istreambuf_iterator 进行逐字符的输入。
- STL 的许多算法要求输入迭代器类型为 iterator 而不是其他几种。
- 迭代器可以进行如下转换:

- 由上可以看出 const_iterator 无法转换成 iterator,而且 reverse_iterator 到 iterator 的转换需要额外的调整,见 item 28。
Item 27:使用 distance 和 advance 将 const_iterator 转换成 iterator。
- 对于 string 和 vector 容器,可以用 iterator i = const_cast<iterator> (ci) 将 const_iterator ci 转换为 iterator i。这是因为在大多数的 STL 实现中 iterator 的定义是 T*,而 const_iterator 的定义是 const T*。
- 在其他的容器中 const_cast 会失败,产生编译错误。
- 可以用如下方法转换:
deque<int> d;
deque<int>::const_iterator ci;
...
deque<int>::iterator i;
i = d.begin();
advance(i, distance< deque<int>::const_iterator> >(i, ci));
deque<int>::const_iterator ci;
...
deque<int>::iterator i;
i = d.begin();
advance(i, distance< deque<int>::const_iterator> >(i, ci));
Item 28:理解 reverse_iterator 的 base iterator。
- reverse_iterator 与 reverse_iterator::base 的关系如图:

- ri.base() 比 ri 滞后一位。
- 对于 insert 可以将 ri 与 ri.base() 看作相等,即:insert(ri, 99) 与 insert(ri.base(), 99) 都会在上图中的 2 和 3 之间插入数字 99。
- 对于 erase 来说:erase(ri) 与 erase(--ri.base()) 相等。
- 在 C/C++ 中,禁止改变从函数中返回的指针(指匿名的那种),而对于 vector 和 string,base() 返回的是 T*,上面的方法将会导致编译出错,解决方法是:erase((++ri).base())。
Item 29:使用 istreambuf_iterator 进行逐字符的输入。
- istream_iterator 使用 operator>> 读取数据,其效率低下(为了处理格式)。
- istream_iterator 跳过空格字符,如果你需要的是“逐字符”的输入,必须首先清除 skipws 状态位:istream_obj.unsetf(ios::skipws)。
- istreambuf_iterator 直接从 stream 的缓冲区中读取下一个字符,并且不会跳过任何字符。
- 如果需要逐字符的输入,使用 istreambuf_iterator。