C++GOW系列之(3):使用标准库

原文请链接http://www.gotw.ca/gotw/003.htm

相比自己手动编码,使用标准库能让你收益良多。我们重新考虑上个GOW的例子,来展示使用已有的标准库能让你避免多少问题。

问题:

在GOW#2里有多少陷进可以在一开始就被避免掉如果程序员使用已有的标准库算法而不是手动编写自己的版本。(注意:同以前一样,即使能改善代码,也不要改变函数的语义)

扼要:

原来的缺陷版本:

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;
  }
    【指南】重用标准库算法而不是编写你自己的版本,它更快,更简单,并且更安全!

你可能感兴趣的:(C++,标准库,GOW)