笔记--迭代器

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指向容器的起始位置.
 

  
  
  
  
  1. Container::iterator itr = container.begin(); 


      2) 用distance()算出const_iterator离iterator的偏移量.
 

  
  
  
  
  1. Container::difference_type offSet = distance<Container::const_iterator>(itr,constItr); 
  2. //这里由于distance要求两个iterator类型一致,故需要显式指明distance调用的模板参数类型. 


      3) 用advance()把iterator向前移和const_iterator距离容器起始位置的偏移量一样的位置.
 

  
  
  
  
  1. 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>>函数进行的是格式化输入,这意味着每次你调用的时候它们都必须做大量工作.
 

你可能感兴趣的:(迭代器,STL,STL,effective)