effective STL 读书笔记——第四章:迭代器

条款26:尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator

1.四个迭代器的转换关系

iterator可以转换为其他三个迭代器,const的迭代器之间可以相互转换,但const的迭代器不能转换为非const的迭代器
反向迭代器可以通过调用base来获取对应的正向迭代器

2.尽量使用iterator的理由

insert和erase需要iterator的迭代器,不接受cosnt_iterator和reverse_iterator
const_iterator不能饮食转换为非const的iterator
reverse_iterator需要转换为iterator时需要特别注意

条款27:用distance和advance把const_iterator转化成iterator

这个条款实际重新构建一个指向begin的iterator,然后通过distance算出begin到const_iterator之间的元素个数,通过advance将iterator移动到const_iterator指向的元素。要注意的是distance需要接受2个相同类型的迭代器,因此为了与const_iterator匹配,要使第一个参数为cosnt_iterator。使用示例如下:

typedef deque<int> IntDeque; // 和以前一样
typedef IntDeque::iterator Iter;
typedef IntDeque::const_iterator ConstIter;
IntDeque d;
ConstIter ci;
//do something
Iter i(d.begin()); // 初始化i为d.begin()
advance(i, distance<ConstIter>(i, ci));// 把i移到指向ci位置

条款28:了解如何通过reverse_iterator的base得到iterator

在不同的场景使用时,得到iterator的算法不一样,这和你实际使用的场景有关,主要原因是由于不管正序还是逆序,begin迭代器都是有效的,end迭代器都是无效的(空容器除外)。比如insert是在指定的iterator后面插入元素,erase是删除当前iterator的元素,对于vector,要删除reverse_iterator指向的元素,应该删除reverse_iterator.base的前一个元素。要在reverse_iterator处插入元素,实际上只要在其base返回的迭代器插入即可,如下:

vector<int> v;
//... // 向v插入1到5
vecot<int>::reverse_iterator ri =
find(v.rbegin(), v.rend(), 3); // 同上,ri指向3
v.erase((++ri).base()); // 尝试删除ri.base()前面的元素;
v.insert(ri.base());

要实现在一个reverse_iterator ri指出的位置上插入新元素,在ri.base()指向的位置插入就行了。对于 insert操作而言,ri和ri.base()是等价的,而且ri.base()真的是ri对应的iterator。

条款29:需要一个一个字符输入时考虑使用istreambuf_iterator

假设我们要把一个文本文件拷贝到一个字符串对象,我们似乎可以如下完成:

ifstream inputFile("interestingData.txt");
inputFile.unset(ios::skipws); // 关闭inputFile的忽略空格的标记
string fileData((istream_iterator<char>(inputFile)), // 把inputFile读入
istream_iterator<char>()); // fileData;关于为什么

虽然上面的代码可以正确完成,但是如果涉及到效率的问题,可能无法满足你的需求。因为istream_iterator实际上是调用Operator<<来读取字符的,它是一个格式化字符的操作,每次读入字符时都会对字符进行检查。如果你仅仅需要读取字符,则可以使用istreambuf_iterator来代替。

ifstream inputFile("interestingData.txt");
string fileData((istreambuf_iterator<char>(inputFile)),
istreambuf_iterator<char>());

istreambuf_iterator不会忽略空格,也不会进行字符格式检查,只是纯粹的读取字符到字符串对象中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值