Effective STL-4 迭代器

2022-10-11  本文已影响0人  my_passion

part4 4种迭代器

正向(从头至尾)遍历  
                对应于容器类 container<T> 的
                
    iterator    ->  T*

    const_      ->  const T*  // 所指元素为const, 而非自身为const 

反向(从尾至头)遍历
    reverse_

    const_reverse_

(1) 关系

(2) 是否可相互转换

(3) 是否可混用

(4) 与 容器及其成员函数 之间的关系

特定形式的insert和erase, 只有1种迭代器可被容器接受, 为什么?

item26: iterator优先于const_iterator/reverse_iterator/const_reverse_iterator

1 4种迭代器关系

(1) 隐式转换只有3种

    iterator      -> 加 const / reverse  特性
    
    reverse_ 版本 -> 加 const 特性

() base()显式转换: 去 reverse 特性

2 如何选择

(1) 有些版本的insert和erase函数要求使用迭代器, 必须用iterator, const和reverse型迭代器不满足要求

(2) item27中, 将const_iterator显式转换成iterator的技术并不普遍适用, 且效率也不能保证

(3) 从reverse_iterator转换而来的iterator使用前可能需要调整(item28)

实践中, 可能

[1] 更多地面临 iterator与const_iterator之间的选择

    ConstIter ci;
    Iter i;
    
    if(i == ci)  // i 隐式转换为 const版本, 再与 ci 比较 

[2] iterator与reverse_iterator之间的选择结果是显而易见: 从头至尾遍历, 还是从尾至头遍历

选了reverse_iterator, 又想调用需要iterator的容器成员函数时

base()转换为一个iterator: 可能需要偏移(item28)

3 插/删时, cosnt 迭代器 "往往"没用,除非将其转换为iterator

item28 reverse_iterator的base()成员函数所产生的iterator: 从正向遍历看, iterator 后偏1个位置

image.png

1 想在reverse_iterator ri所指位置上插入 => 直接在ri.base()位置处插

    以 vector 想象

2 想在reverse_iterator ri所指位置上删除

=> 要在 ri.base() (正向来看)前面的位置上删 => ri 前置自增, 再取base(), 再删

    vector<int>::reverse_iterator ri = 
        find(v.rbegin(), v.end(), 3);
    
    // 对vector/string 之外的标准容器, ok; 
    // 对vector/string, 迭代器非指针时, 也ok; 
    //          迭代器即指针时, error, 原因: C和C++都规定了从函数返回的指针不应该被修改
    v.erase(--ri.base() );
    
    // 通用做法
    v.erase((++ri).base() );
上一篇下一篇

猜你喜欢

热点阅读