MulaiMulai sekarang secara gratis

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

Lihat Kursus

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 ukuran 0.
    • Di dalam blok if pada perulangan for, gunakan push_back() dari positive_x untuk menambahkan elemen ke-i dari x.
  • 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)
)
*/
Edit dan Jalankan Kode