Bắt đầu ngayBắt đầu miễn phí

Vector trong STL

Standard Template Library (stl) là một thư viện C++ chứa các thuật toán và cấu trúc dữ liệu linh hoạt. Ví dụ, vector kiểu double trong stl tương đương với NumericVector của Rcpp ở dạng "C++ thuần". Đoạn mã sau tạo một vector double chuẩn tên là x với mười phần tử.

std::vector<double> x(10);

Thông thường, bám theo các kiểu vector của Rcpp hợp lý hơn vì bạn có nhiều phương thức tiện lợi hoạt động giống như trong R, bao gồm mean(), round(), và abs(). Tuy vậy, vector của stl có ưu điểm là có thể thay đổi kích thước động mà không phải sao chép dữ liệu mỗi lần. Điều đó cho phép bạn viết mã đơn giản hơn, như hàm "bad" ở bài trước, nhưng vẫn giữ được hiệu năng của mã "good".

Bài tập này là một phần của khóa học

Tối ưu hóa mã R với Rcpp

Xem khóa học

Hướng dẫn bài tập

  • Hoàn thiện định nghĩa select_positive_values_std(), một hàm dựa trên vector của stl để chọn các số dương.
    • Đặt kiểu trả về của hàm là vector double chuẩn dùng std::vector<double>.
    • Khai báo một vector double chuẩn, positive_x, với kích thước 0.
    • Bên trong khối if trong vòng lặp for, dùng push_back() của positive_x để thêm phần tử thứ i của x.
  • good_select_positive_values_cpp() từ bài tập trước đã có sẵn trong workspace của bạn để so sánh. Xem đầu ra trên console để thấy tốc độ tương đối của hai hàm.

Bài tập tương tác thực hành trực tiếp

Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.

#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)
)
*/
Chỉnh sửa và Chạy Mã