C articles:GuruoftheWeek#3:使用标准库

2008-02-23 05:33:14来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

/*此文是译者出于自娱翻译的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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C 箴言:让=返回一个*this的引用

下一篇: C articles:GuruoftheWeek#4--ClassMechantics

热门词条
热门标签