zoukankan      html  css  js  c++  java
  • ###《Effective STL》--Chapter4

    点击查看Evernote原文

    #@author:       gr
    #@date:         2014-09-14
    #@email:        forgerui@gmail.com
    

    Chapter4 迭代器

    Topic 26: iterator优先于const_iteratorreverse_iteratorconst_reverse_iterator

      在一些程序中,需要iterator的支持,而const_iterator无法满足要求,所以尽量使用iterator

    Topic 27: 使用distanceadvance将容器的const_iterator转换成iterator

      使用distance可以计算两个迭代器(指向同一个容器)之间的距离,使用advance可以移动。

    //const_iterator无法直接转换为iterator,会报错
    deque<int>::const_iterator ci;
    deque<int>::iterator i (ci);
    //使用distance和advance组合去实现
    advance(i, distance(i, ci));
    

      所以结论和Topic 26一样,尽量使用iterator代替constreverse

    Topic 28: 正确理解由reverse_iteratorbase()成员函数所产生的iterator的用法

      容器类的有些成员函数只支持iterator,所有有时需要对其它类型进行转换。reverse_iteratorbase()iterator的对应结果依据你的操作而定:
      对于插入操作,两者的相对插入位置正好对应。无需进行++,--操作。

        vector<int>::reverse_iterator ri = find(v.rbegin(), v.rend(), 3);
        vector<int>::iterator i(ri.base());
        ve.insert(i, e);
    

      对于删除操作,转换之后,两者则不是删除同一个元素。下面的删除有问题,C和C++都规定从函数返回的指针不应被修改,所以在某些实现下会无法通过编译。

        //下面的删除有问题,可能无法编译
        ve.erase(--ri.base());
    

      解决方法是在base()之前进行修改,之后再转换。

        ve.erase((++ri).base());
    

    Topic 29: 对于逐个字符的输入请考虑使用istreambuf_iterator

      istreambuf_iterator直接从流的缓冲区中读取下一个字符,不会做安全检查,速度更快,可以提高40%,但只多敲了3个字符。

    ifstream inputfile("a.txt");
    string fileData(istreambuf_iterator<char>(inputfile), istreambuf_iterator<char>());
  • 相关阅读:
    canvas实现圆角图片 (处理原图是长方形或正方形)
    px2rem在vue项目中的使用
    fastclick在混合app内卡死
    禁止网页的右键和复制功能
    2.Knockout.Js(监控属性Observables)
    1.Knockout.Js(简介)
    KnockoutJS学习笔记10:KonckoutJS foreach绑定
    mvc中使用knockoutjs和ajax
    15个最好的Bootstrap设计工具推荐
    在WIN7下安装运行mongodb 1)、下载MongoDB
  • 原文地址:https://www.cnblogs.com/gr-nick/p/3996113.html
Copyright © 2011-2022 走看看