c++ stl 五种迭代器(转载)

    转自: http://anwj336.blog.163.com/blog/static/894152092010113122225952/

    迭代器的分类(Iterator Categories)
    Input Iterator: 只读向前遍历的迭代器。例如:istream。 
    Output Iterator: 只写向前遍历的迭代器。例如:ostream, inserter。 
    Forward Iterator: 可读可写向前遍历的迭代器。 
    Bidirectional Iterator: 可读可写双向遍历迭代器。例如:list, set, multiset, map, multimap。 
    Random Access Iterator: 可读可写随机访问迭代器。例如:vector, deque, string, array。 

    1 Input Iterators
    Input Iterator只能逐元素的向前遍历,而且对元素是只读的,只能读取元素一次。通常这种情况发生在从标准输入设备(通常是键盘)读取数据时。
    下面是Input Iterator的可用操作列表:
    *iter: 只读访问对应的元素 
    iter->member: 只读访问对应元素的成员 
    ++iter: 向前遍历一步(返回最新的位置) 
    iter++: 向前遍历一步(返回原先的位置) 
    iter1 == iter2: 判断两个迭代器是否相等 
    iter1 != iter2:判断两个迭代器是否不等 
    TYPE(iter): 复制迭代器 
 

    2 Output Iterators

    Output iterator跟Input Iterator相对应,只能逐元素向前遍历,而且对元素是只写的(*iter操作不能作为右值,只能作为左值),只能写入元素一次。通常这种情况发生在向标准输出设备(屏幕或者打印机)写入数据时,或者利用inserter向容器中追加新元素时。

    下面是Output Iterator的可用操作列表:
    *iter = value: 向对应的元素写入新值 
    ++iter: 向前遍历一步(返回最新的位置) 
    iter++: 向前遍历一步(返回原先的位置) 
    TYPE(iter): 复制迭代器 

    3 Forward Iterators

    Forward Iterator是Input Iterator和Output Iterator的结合,虽然也只能逐元素向前遍历,但可以对元素进行读写操作。下面看Forward Iterator的可用操作列表:

    *iter:  
    iter->member:  
    ++iter:  
    iter++:  
    iter1 == iter2:  
    iter1 != iter2:  
    TYPE():  
    TYPE(iter):  
    iter1 = iter2:  

    跟Input Iterator和Output Iterator不同的是,Forward Iterator可以对同一元素访问多次。
    下面我们特别关注一下Forward Iterator和Output Iterator的区别:

    (1)对于Output Iterator,写入数据时不检查目标容器是否到达结束位置是正确的做法,比如下面循环对于Output Iterator是成立的:
     //ok for output iterator

     //error for forward iterator
     while(true) 
    {
          *pos = foo();
          ++pos;
    }

    (2)对于Forward Iterator,则必须保证访问元素的有效性,那么上面形式对Forward Iterator来说是错误的,因为当碰到容器end()位置时,导致不确定的后果。对于Forward Interator,上面形式必须修改为这样:

    while(pos != col1.end()) 
    {
         *pos = foo();
         ++pos;
    }

    4 Bidirectional Iterators

    双向迭代器行为特征类似于Forward Iterator,只是额外增加了一个逐元素向后遍历的能力。所以对于双向迭代器可用的操作,除了包含Forward Iterator的所有操作外,多了一组向后遍历的操作:

    --iter: 向后遍历一步(返回最新的位置) 
    iter--: 向后遍历一步(返回原有的位置) 

    5 Random Access Iterators

    随机访问迭代器除了有双向迭代器的能力特征外,还可以进行元素随机访问。所以对于随机访问迭代器,增加了关于“迭代器运算”的一些操作。下面是除了双向迭代器的所有操作外,额外的操作列表:

    iter[n]: 直接访问索引为n的元素 
    iter+=n: 向前或向后(n为负数)遍历n个元素 
    iter-=n: 先后或向前(n为负数)遍历n个元素 
    iter+n: 返回当前位置后面第n个元素的iterator位置 
    n+iter: 同上 
    iter-n: 返回当前位置前面第n个元素的iterator位置 
    iter1-iter2: 返回iter1和iter2之间的距离(distance) 
    iter1<iter2: 判断iter1是否在iter2之前 
    iter1>iter2: 判断iter1是否在iter2之后 
    iter1<=iter2: 判断iter1是否不再iter2之后 
    iter1>=iter2: 判断iter1是否不再iter2之前

posted on 2013-05-17 11:56  次奥砖家  阅读(255)  评论(0编辑  收藏  举报

导航