C++ articles:Guru of the Week #3:使用標準庫 (轉)

worldblog發表於2007-12-04
C++ articles:Guru of the Week #3:使用標準庫 (轉)[@more@]

作者:Hub Sutter
譯者:plpliuly

/*此文是譯者出於自娛翻譯的GotW(Guru of the Week)系列文章第3篇,原文的版權是屬於Hub Sutter(著名的C++專家,"Exceptional C++"的作者)。此文的翻

譯沒有徵得原作者的同意,只供學習討論。——譯者
*/

#3 使用標準庫
難度:3/10

使用標準庫提供的演算法比你自己手工寫一個要方便的多。仍然以GotW #2中討論的定義為例子,我們將看到如果直接使用標準庫將會避免很多問題。

問題
  如果我們用標準庫中的已有演算法代替GotW#2中的最初程式碼中的迴圈,有哪些問題可以自然避免?(注意:與以前一樣,不能改變函式的語義。)

GotW #2中的問題回顧
  最初的實現:
  string FindAddr( list l, string name )
  {
  for( list::iterator i = l.begin();
  i != l.end();
  i++ )
  {
  if( *i == name )
  {
  return (*i).addr;
  }
  }
  return "";
  }

  經過修改後,除了l.end()依然是每次迴圈到要,其餘的不足之處均已修改(譯者:請參看GotW #2):
  string FindAddr( const list& l,
  const string& name )
  {
  string addr;
  for( list::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 l, string name )
  {
  list::iterator i =
  find( l.begin(), l.end(), name );

  if( *i != l.end() )
  {
  return (*i).addr;
  }
  return "";
  }
  再結合我們在GotW #2中提到的修改方法,最終可以得到如下程式碼:
  string FindAddr( const list& l,
  const string& name )
  {
  string addr;
  list::const_iterator i =
  find( l.begin(), l.end(), name );

  if( i != l.end() )
  {
  addr = (*i).addr;
  }
  return addr;
  }
  [忠告]儘量使用標準庫演算法,因為那樣比自己手動重新寫一個演算法要快捷,而且不易出錯。
(結束)

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988190/,如需轉載,請註明出處,否則將追究法律責任。

相關文章