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>());
posted @ 2021-08-19 15:45  CoolGin  阅读(53)  评论(0编辑  收藏  举报