技术开发 频道

在C++中使用Lambda函数提高代码性能

  如果使用了声明式循环技巧,那么将并行方法应用在矢量求和上则更加干净简单。STL for_each函数是一个理想的替代品,以上的例子则被改写如下:

class Adder{
private:
int _total;
public:
Adder() : _total(
0) {}

void operator ( ) ( int& i )
{
  _total
+= i;
}

operator int ( )
{
  
return  _total;
}
};

void VectorAdd()
{
std::vector
<int> v;
v.push_back(
1);
v.push_back(
5);
int total = std::for_each(v.begin(), v.end(), Adder());
}

  这里,具体的for循环被舍弃,求矢量和的代码变得干净了一些;但是由于需要使用一系列运行符来定义一个类,这使得这个解决方案被大大的复杂化了。 除非代码库中还有大量类似的求和声明,否则一个开发者是不会仅仅为了STL for_each的那点好处而多花费功夫去定义一个新类的。

  仔细检查这个Adder类,可以很明显的看出其大部分内容都仅仅是用来满足将实例用作函数对象的调用条件的。这个类中唯一起到计算作用的仅仅是那一 行_total += i。考虑到这一点,C++ 0x提供了一个被大大简化了的、以lambda函数方式来实现的语法技巧。Lambda函数移除了对这些搭架子代码的需求,并允许在另外的一个声明中定义 一个谓词函数。由此,VectorAdd函数可以被改写如下:

std::vector<int> v;
v.push_back(
1);
v.push_back(
5);
int total = 0;
std::for_each(v.begin(), v.end(),
[
&total](int x) {total += x;}
);
0
相关文章