第 5 章 C++11

C++11是在2011年新建立的C++标准,该标准引入了新的函数(functionalities)和符号(notations)。相较于之前的标准,很多新的特性使得C++对于初学者而言更为简单。本文档会对C++11的新特性做很多探索。

重要:代码示例是在默认C++11可得的情况下写的。

5.1 开启C++11

为了开启C++11,在你的Rcpp代码中任意一处加入下面的代码。

5.2 推荐的 C++11 特性

5.2.3 decltype

通过使用 decltype,你能声明变量的类型与已存在的变量相同.

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 例子

译者:上面代码中也使用sapply函数,将R中的function(x)(A*x) 用lambda表达式的方式替代。而sapply,则是吃到了Rcpp给我们提供的语法糖(sugar)。如果要对语法糖有更深的了解,可以阅读Rcpp:R与C++的无缝整合中的相关章节。