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>());
  • 相关阅读:
    【转】MyEclipse快捷键大全
    【转】MOCK测试
    【转】万亿移动支付产业的难点和痛点
    【转】【CTO俱乐部走进支付宝】探索支付宝背后的那些技术 部分
    CTO俱乐部
    tomcat修改默认端口
    VS2013试用期结束后如何激活
    项目中遇到的 linq datatable select
    LINQ系列:LINQ to DataSet的DataTable操作
    C#中毫米与像素的换算方法
  • 原文地址:https://www.cnblogs.com/gr-nick/p/3996113.html
Copyright © 2011-2022 走看看