43 算法调用优先于手写的循环

理由:
1.效率:算法通常比程序员自己写的循环效率更高
2.正确性:自己写循环比使用算法更容易出错
3.可维护性:使用算法代码通常比手写循环的代码更加简洁明了

例如假如有一个数组(可能由于某个遗留下来的C API的原因),而你要让每个数组元素加上41,然后插入到一个deque的前部。

自己编写循环:
//输入参数是一个指向double数组的指针和该数组的大小
//在函数中,将向这个数组写入数据,它的返回值实际被
//个数
size_t fillArray(double* pArray,size_t arraySize);
double data[maxNumDoubles];
deque<double> d;
...

size_t numDouble = fillArray(data,maxNumDoubles);
for(size_t i = 0; i < numDouble; ++i)
	d.insert(d.begin(),data[i] + 41); //这里有问题

上面代码插入的的数据与data中相应的数据排序顺序相反。
下面方法进行改进:
deque<double>::iterator insertLocation = d.begin();
for(size_t i = 0; i < numDouble; ++i)
	d.insert(insertLocation++,data[i] + 41); //迭代器失效问题
上述代码会导致迭代器失效问题。
最后可能得到的代码是:

deque<double>::iterator insertLocation = d.begin();
for(size_t i = 0; i < numDouble; ++i)
{
	insertLocation = d.insert(insertLocation,data[i] + 41); //迭代器失效问题
	++insertLocation;
}

如果用算法代码就是如下一句话,简单一句话:
transform(data,data+numDouble,
		 inserter(d,d.begin()),
		 bind2nd(plus<double>(),41);
		)

相反条款,它反应了一种拒绝进入美好的情形;
如下代码:
vector<int> v;
int x,y;
...
vector<int>::iterator i = v.begin();
for(; i!=e.end(); ++i)	
{
	if(*i > x && *i < y)
		break;
	...
}	
如果用STL算法:
vector<int>::iterator i = 
	find_if(v.begin(),v.end(),
		compose2(logical_and<bool>(),
			bind2nd(greater<int>(),x)
			bind2nd(<less<int>()>,y)));

还有另外情形在函数子类中实现比较,但是写个函数子类的代码比使用循环简单的多,此情况下使用简单循环要好些。

如果你要做的工作与一个算法所实现的功能很接近,那么算法调用更加好;但是如果你的循环很简单,而使用算法来实现,却要求混合使用绑定器和配接器或者要求一个单独的函数子类,那么,可以使用手写的循环更好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值