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
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ước0. - Bên trong khối
iftrong vòng lặpfor, dùngpush_back()củapositive_xđể thêm phần tử thứ i củax.
- Đặt kiểu trả về của hàm là vector double chuẩn dùng
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)
)
*/