Kom igångKom igång gratis

STL-vektorer

Standard template library (STL) är ett C++-bibliotek med flexibla algoritmer och datastrukturer. Till exempel är dubbelvektorn från STL ett "nativt C++"-alternativ till Rcpp:s NumericVector. Följande kod skapar en standard-dubbelvektor med namnet x och tio element.

std::vector<double> x(10);

I de flesta fall är det bättre att hålla sig till Rcpp:s vektortyper, eftersom de ger tillgång till många smidiga metoder som fungerar precis som sina R-motsvarigheter – till exempel mean(), round() och abs(). STL-vektorerna har dock en fördel: de kan ändra storlek dynamiskt utan att data kopieras varje gång. Det gör det möjligt att skriva enklare kod, liknande den "dåliga" funktionen från föregående övning, men ändå behålla prestandan hos den "bra" koden.

Den här övningen är en del av kursen

Optimera R-kod med Rcpp

Visa kurs

Övningsinstruktioner

  • Fyll i definitionen av select_positive_values_std(), en STL-vektorbaserad funktion för att välja ut positiva tal.
    • Ange returtypen för funktionen som en standard-dubbelvektor med std::vector<double>.
    • Definiera en standard-dubbelvektor, positive_x, med storleken 0.
    • Inuti if-blocket i for-slingan använder du push_back()positive_x för att lägga till det i:te elementet i x.
  • good_select_positive_values_cpp() från föregående övning finns tillgänglig i din arbetsyta för jämförelse. Granska utdata i konsolen för att se den relativa hastigheten hos de två funktionerna.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

#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)
)
*/
Redigera och kör kod