美文网首页
Effective STL-4 迭代器

Effective STL-4 迭代器

作者: my_passion | 来源:发表于2022-10-11 23:58 被阅读0次

    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() );
    

    相关文章

      网友评论

          本文标题:Effective STL-4 迭代器

          本文链接:https://www.haomeiwen.com/subject/utwxzrtx.html