開始使用免費開始

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_xpush_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)
)
*/
編輯並執行程式碼