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。
本文探讨了STL中不同类型的迭代器之间的转换方法,包括iterator、const_iterator、reverse_iterator及const_reverse_iterator的使用场景与注意事项。文章还介绍了如何通过distance和advance将const_iterator转换为iterator,以及reverse_iterator的特殊性质和正确用法。最后,本文提供了使用istreambuf_iterator进行高效逐字符输入的建议。
1670

被折叠的 条评论
为什么被折叠?



