Vektor STL
The standard template library (stl) adalah pustaka C++ yang berisi algoritma dan struktur data yang fleksibel. Misalnya, vektor bertipe double dari stl adalah padanan "C++ native" dari NumericVector milik Rcpp. Kode berikut membuat sebuah vektor double standar bernama x dengan sepuluh elemen.
std::vector<double> x(10);
Biasanya lebih masuk akal untuk tetap menggunakan tipe vektor Rcpp karena ini memberi Anda banyak metode praktis yang bekerja seperti padanan di R, termasuk mean(), round(), dan abs(). Namun, vektor stl memiliki keunggulan karena ukurannya dapat berubah secara dinamis tanpa harus menyalin data setiap kali. Hal itu memungkinkan kita menulis kode yang lebih sederhana, seperti fungsi "buruk" pada latihan sebelumnya, sambil mempertahankan performa seperti kode "baik".
Latihan ini adalah bagian dari kursus
Mengoptimalkan Kode R dengan Rcpp
Petunjuk latihan
- Lengkapi definisi
select_positive_values_std(), sebuah fungsi berbasis vektor stl untuk memilih bilangan positif.- Tetapkan tipe kembalian fungsi menjadi vektor double standar menggunakan
std::vector<double>. - Definisikan vektor double standar,
positive_x, dengan ukuran0. - Di dalam blok
ifpada perulanganfor, gunakanpush_back()daripositive_xuntuk menambahkan elemen ke-i darix.
- Tetapkan tipe kembalian fungsi menjadi vektor double standar menggunakan
good_select_positive_values_cpp()dari latihan sebelumnya tersedia di workspace Anda untuk perbandingan. Periksa keluaran konsol untuk melihat perbandingan kecepatan kedua fungsi.
Latihan interaktif praktis
Cobalah latihan ini dengan menyelesaikan kode contoh berikut.
#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)
)
*/