zoukankan      html  css  js  c++  java
  • Guru of the Week 条款03: 使用标准库

    GotW #03 Using the Standard Library (or, Temporaries Revisited)

    著者:Herb Sutter     

    翻译:kingofark

    [声明]:本文内容取自www.gotw.ca网站上的Guru of the Week栏目,其著作权归原著者本人所有。译者kingofark在未经原著者本人同意的情况下翻译本文。本翻译内容仅供自学和参考用,请所有阅读过本文的人不要擅自转载、传播本翻译内容;下载本翻译内容的人请在阅读浏览后,立即删除其备份。译者kingofark对违反上述两条原则的人不负任何责任。特此声明。

    Revision 1.0

    Guru of the Week 条款03: 使用标准库(或者说,再次造访临时对象)

    难度:3 / 10

    (使用标准库的算法要比使用自己徒手编写的算法实现好得多。这里我们将重新使用GotW 条款02中的例子,借以说明,通过简单的复用(reuse)那些标准库里面已有的东西,将会避免多少麻烦的问题。)

    [问题]

    一旦程序员使用标准库算法而不是编写自己的算法版本时,首先就可以避免GotW条款02中的多少个缺陷?(注意:和上次一样,不能改变函数的语义,即使这样做可以改良函数本身。)

    [版本翻新]

    原始的错误版本:

     string FindAddr( list<Employee> l, string name )
     {
        for( list<Employee>::iterator i = l.begin();
             i != l.end();
             i++ )
        {
          if( *i == name )
          {
            return (*i).addr;
          }
        }
        return "";
     }

    修正的版本(仍然存在对l.end()多余的调用):

     string FindAddr( const list<Employee>& l,
                       const string& name )
     {
        string addr;
        for( list<Employee>::const_iterator i = l.begin();
             i != l.end();
             ++i )
       {
          if( (*i).name == name )
          {
            addr = (*i).addr;
            break;
          }
        }
        return addr;
     }

    [解答]

    不需要什么别的改变,只要简单的使用find()就可以避免产生两个临时对象和原始版本中几乎所有l.end()带来的低效:

     string FindAddr( list<Employee> l, string name )
     {
        list<Employee>::iterator i =
          find( l.begin(), l.end(), name );
     
        if( *i != l.end() )
        {
          return (*i).addr;
        }
        return "";
     }

    再进行一些其它的修正,得到:

     string FindAddr( const list<Employee>& l,
                       const string& name )
     {
        string addr;
        list<Employee>::const_iterator i =
          find( l.begin(), l.end(), name );
     
        if( i != l.end() )
        {
          addr = (*i).addr;
        }
        return addr;
     }

    [学习指导]:请复用标准库的算法,而不要编写自己的算法版本。这样做更快、更容易、更安全!

    男人就是责任!
  • 相关阅读:
    1144 The Missing Number (20分)
    1145 Hashing
    1146 Topological Order (25分)
    1147 Heaps (30分)
    1148 Werewolf
    1149 Dangerous Goods Packaging (25分)
    TypeReference
    Supervisor安装与配置()二
    谷粒商城ES调用(十九)
    Found interface org.elasticsearch.common.bytes.BytesReference, but class was expected
  • 原文地址:https://www.cnblogs.com/snben/p/2658950.html
Copyright © 2011-2022 走看看