第 5 章 C++11
C++11是在2011年新建立的C++标准,该标准引入了新的函数(functionalities)和符号(notations)。相较于之前的标准,很多新的特性使得C++对于初学者而言更为简单。本文档会对C++11的新特性做很多探索。
重要:代码示例是在默认C++11可得的情况下写的。
5.2 推荐的 C++11 特性
5.2.1 初始化
使用 {}
来初始化变量.
5.2.2 auto
使用auto
关键字,根据赋值,来推断变量的类型
5.2.4 基于范围的for循环
能用一种比较R风格的方式来写for循环。
5.2.5 Lambda 表达式
你能使用lambda表达式来创建一个函数对象。函数对象常用于作为未命名函数传递给其他函数。
Lambda表达式的形式为 [](){}
.
在 []
中,写你希望在函数对象中使用的局部变量的列表.
[]
不允许函数对象获取所有的局部变量.[=]
传值,将所有局部变量的值传递给函数对象.[&]
引用,函数直接引用所有的局部变量的值.[=x, &y]
“x” 传值给函数对象,而“y” 可以被函数对象直接引用.
在 ()
中,写传递给函数的参数列表.
在{}
中,写想做的操作.
lambda 表达式的返回类型
函数对象的返回类型会被自动地设定为{}
操作中返回值的类型。如果你希望显式定义返回类型,可以按照[]()->int{}
的方式。
例子 下面的例子展示了如何使用lambda表达式。可以按照R的风格来写某些类型的C++代码。
R 例子
译者:上面的sapply函数,将function(x){A*x}作用于v中的每个元素。这是很典型的向量化编程,可以看apply函数族来对此有更深的了解。
Rcpp 例子
// [[Rcpp::plugins("cpp11")]]
// [[Rcpp::export]]
NumericVector rcpp_lambda_1(){
NumericVector v = {1,2,3,4,5};
double A = 2.0;
NumericVector res =
sapply(v, [&](double x){return A*x;});
return res;
}
译者:上面代码中也使用sapply函数,将R中的function(x)(A*x) 用lambda表达式的方式替代。而sapply,则是吃到了Rcpp给我们提供的语法糖(sugar)。如果要对语法糖有更深的了解,可以阅读Rcpp:R与C++的无缝整合中的相关章节。