STL 向量
standard template library(stl)是 C++ 的函式庫,包含彈性的演算法與資料結構。以 stl 的 double 向量為例,它就像是 Rcpp 的 NumericVector 的「原生 C++」對應物。以下程式碼會建立一個名為 x、含有 10 個元素的標準 double 向量。
std::vector<double> x(10);
通常建議以 Rcpp 的向量型別為主,因為它提供了許多和 R 類似的便利方法,例如 mean()、round()、abs()。不過,stl 的向量有一個優點:它可以動態調整大小,而且不需要每次都付出資料複製的成本。這讓我們可以寫出更簡潔的程式碼,例如前一題中的「不好」版本函式,同時仍保有「好」版本程式碼的效能。
本練習屬於課程
用 Rcpp 最佳化 R 程式碼
練習說明
- 完成
select_positive_values_std()的定義,這是一個以 stl 向量實作、用來篩選正數的函式。- 將函式的回傳型別設為使用
std::vector<double>的標準 double 向量。 - 定義一個大小為
0的標準 double 向量positive_x。 - 在
for迴圈的if區塊中,使用positive_x的push_back()將x的第 i 個元素加入。
- 將函式的回傳型別設為使用
- 前一題的
good_select_positive_values_cpp()已載入到你的工作環境可供比較。請查看主控台輸出,觀察兩個函式的相對速度。
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
#include
using namespace Rcpp;
// Set the return type to a standard double vector
// [[Rcpp::export]]
___ select_positive_values_std(NumericVector x) {
int n = x.size();
// Create positive_x, a standard double vector
___;
for(int i = 0; i < n; i++) {
if(x[i] > 0) {
// Append the ith element of x to positive_x
___;
}
}
return positive_x;
}
/*** R
set.seed(42)
x <- rnorm(1e6)
# Does it give the same answer as R?
all.equal(select_positive_values_std(x), x[x > 0])
# Which is faster?
microbenchmark(
good_cpp = good_select_positive_values_cpp(x),
std = select_positive_values_std(x)
)
*/