您的位置:首页 > Web前端

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

2017-05-13 20:59 483 查看

条款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指向的元素。要
bb47
注意的是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不会忽略空格,也不会进行字符格式检查,只是纯粹的读取字符到字符串对象中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  读书笔记 iterator