Vectori STL
Biblioteca standard de șabloane (STL) este o bibliotecă C++ care conține algoritmi și structuri de date flexibile. De exemplu, vectorul de tip double din STL este echivalentul „nativ C++" al NumericVector din Rcpp. Codul de mai jos creează un vector standard de tip double numit x cu zece elemente.
std::vector<double> x(10);
De obicei, are mai mult sens să folosești tipurile de vectori Rcpp, deoarece îți oferă acces la multe metode utile care funcționează similar cu echivalentele lor din R, inclusiv mean(), round() și abs(). Totuși, vectorii STL au un avantaj important: pot crește dinamic în dimensiune fără a plăti costul copierii datelor la fiecare modificare. Astfel, putem scrie cod mai simplu – similar cu funcția „bad" din exercițiul anterior – păstrând în același timp performanța codului „good".
Acest exercițiu face parte din cursul
Optimizarea codului R cu Rcpp
Instrucțiuni pentru exercițiu
- Completează definiția funcției
select_positive_values_std(), o funcție bazată pe vectori STL care selectează numerele pozitive.- Setează tipul returnat al funcției la un vector standard de tip double, folosind
std::vector<double>. - Definește un vector standard de tip double,
positive_x, cu dimensiunea0. - În interiorul blocului
ifdin buclafor, folosește metodapush_back()a luipositive_xpentru a adăuga al i-lea element al luix.
- Setează tipul returnat al funcției la un vector standard de tip double, folosind
good_select_positive_values_cpp()din exercițiul anterior este disponibilă în spațiul tău de lucru pentru comparație. Examinează rezultatele din consolă pentru a vedea vitezele relative ale celor două funcții.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
#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)
)
*/