4 迭代器
~~~~~~~~~
现标准STL容器提供了四种不同的迭代器:
* iterator
* const_iterator
* reverse_iterator
* const_reverse_iterator
4.1 尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator
==============================================================================
1. 尽量使用iterator取代const或者reverse类型的迭代器的原因为:
* insert和erase的一些版本要求iterator。
如果你需要调用这些函数,你就必须产生iterator,而不能用const或reverse iterators。
* 不可能把const_iterator隐式转换成iterator.
从一个const_iterator产生一个iterator的技术并不普遍适用,而且不保证高效。
* 从reverse_iterator转换而来的iterator在转换之后可能需要相应的调整.
4.2 用distance和advance把const_iterator转化为iterator
======================================================
1. 使用const_cast无法从const_iterator转化为iterator.
对于这些容器而言,iterator和const_iterator是完全不同的类.
2. 如果你得到一个const_iterator并且可以访问它所指向的容器,那么有一种安全的,可移植的方法获取它所对应的iterator
1) 将iterator指向容器的起始位置.
- Container::iterator itr = container.begin();
2) 用distance()算出const_iterator离iterator的偏移量.
- Container::difference_type offSet = distance<Container::const_iterator>(itr,constItr);
- //这里由于distance要求两个iterator类型一致,故需要显式指明distance调用的模板参数类型.
3) 用advance()把iterator向前移和const_iterator距离容器起始位置的偏移量一样的位置.
- advance(itr,offSet);
4.3 了解如何通过reverse_iterator的base得到iterator
===================================================
1. 调用reverse_iterator的base成员函数可以产生"对应的"iterator
* 要实现在一个reverse_iterator ri指出的位置上插入新元素,在ri.base()指向的位置插入就行了。
对于insert操作而言,ri和ri.base()是等价的,而且ri.base()真的是ri对应的iterator。
* 要实现在一个reverse_iterator ri指出的位置上删除元素,就应该删除ri.base()的前一个元素。
对于删除操作而言,ri和ri.base()并不等价,而且ri.base()不是ri对应的iterator.
(++ri).base才是ri对应的iterator。
4.4 需要一个一个字符输入时考虑使用istreambuf_iterator
======================================================
1. istream_iterators默认情况不能读取空格.
因为它是使用operator>>函数来进行真的读取,而且operator>>函数在默认情况下忽略空格
2. istream_iterators的效率比istreambuf_iterator效率低
istream_iterator所依靠的operator>>函数进行的是格式化输入,这意味着每次你调用的时候它们都必须做大量工作.
本文出自 “暗日” 博客,请务必保留此出处http://darksun.blog.51cto.com/3874064/1162472