Effective STL 笔记-第4章 迭代器
4 迭代器
第 26 条:iterator 优先于 const_interator、reverse_interator 及 const_reverse_interator。
不同类型的迭代器之间的关系:
尽量使用 iterator 而不是 const 或 reverse 型的迭代器,可以使得容器的使用更为简单而有效,并且可以避免潜在的问题。
- 有些版本的 insert 和 erase 函数要求使用 iterator。如果你需要调用这些函数,必须使用 iterator,const 和 reverse 型的迭代器不能满足这些函数的要求。
- 要想隐式地将一个 const_interator 转换成 iterator 是不可能的。
- 从 reverse_interator 转换而来的 iterator 在使用之前可能需要相应的调整。
- 尽量不要混合使用 iterator 和 const_interator,有可能通过不了编译。
第 27 条:使用 distance 和 advance 将容器的 const_interator 转换成 iterator。
包含显式类型转换的代码不能通过编译的原因:对于这些容器类型(deque,list,set,multiset,map,multimap),iterator 和 const_interator 是完全不同的类。
typedef intDeque::const_interator ConstIter;
ConstIter ci;
...
Iter i(ci); // 编译错误!从const_interator到
// iterator没有隐式转换途径。
Iter i(const_caset<Iter>(ci)); // 仍然是编译错误!不能将
// const_iterator强制转换为iterator
不过,对于 vector 和 string 而言,以上代码也许能通过编译。
vector:const T* 变为 const *
string:char * 变为 const char *
将 const_interator 转换为 iterator 可能需要线性时间的代价(双向迭代器),安全、可移植不需要线性时间(随机访问迭代器)的代价。
将 advance 那一行改为
advance(i, distance<ConstIter>(i, ci)); // 将i和ci都当做const_interator,
// 计算出它们之间的距离,然后将i移动这段距离
第 28 条:正确理解由 reverse_interator 的 base() 成员函数所产生的 iterator 的用法。
删除 ri 所指的元素:v.erase((++ri).base() );
不能对 base 的结果做递减操作,先递增 ri,再调用 base() 函数。
第 29 条:对于逐个字符的输入请考虑使用 istreambuf_iterator。
如果你需要从一个输入流中逐个读取字符,那么就不必使用格式化输入,使用 istreambuf_interator 可获得明显的性能改善:直接从流的缓冲区读取下一个字符。
复制文本文件的内容到 string:
ifstream inputFile("interestingData.txt");
string fileData((istreambuf_iterator<char>(inputFile)),
istreambuf_iterator<char>());