C articles:GuruoftheWeek#3:使用标准库
2008-02-23 05:33:14来源:互联网 阅读 ()
/*此文是译者出于自娱翻译的GotW(Guru of the Week)系列文章第3篇,原文的版权是属于Hub Sutter(着名的C 专家,"Exceptional C "的作者)。此文的翻
译没有征得原作者的同意,只供学习讨论。——译者
*/
#3 使用标准库
难度:3/10
使用标准库提供的算法比您自己手工写一个要方便的多。仍然以GotW #2中讨论的函数定义为例子,我们将看到假如直接使用标准库将会避免很多问题。
问题:
假如我们用标准库中的已有算法代替GotW#2中的最初代码中的循环,有哪些问题能够自然避免?(注意:和以前相同,不能改变函数的语义。)
GotW #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()依然是每次循环到要调用,其余的不足之处均已修改(译者:请参看GotW #2):
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 "";
}
再结合我们在GotW #2中提到的修改方法,最终能够得到如下代码:
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;
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash