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
Ö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 storleken0. - Inuti
if-blocket ifor-slingan använder dupush_back()påpositive_xför att lägga till det i:te elementet ix.
- Ange returtypen för funktionen som en standard-dubbelvektor med
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)
)
*/