Effective STL 读书笔记 5

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Item 26:优先使用 iterator 而不是 const_iterator, reverse_iterator, const_reverse_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));


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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值