ÎncepețiÎncepe gratuit

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

Vezi cursul

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 dimensiunea 0.
    • În interiorul blocului if din bucla for, folosește metoda push_back() a lui positive_x pentru a adăuga al i-lea element al lui x.
  • 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)
)
*/
Editează și rulează codul