CommencerCommencer gratuitement

Vecteurs STL

La Standard Template Library (STL) est une bibliothèque C++ qui propose des algorithmes et des structures de données flexibles. Par exemple, le vecteur de double de la STL est l’équivalent « C++ natif » du NumericVector de Rcpp. Le code suivant crée un vecteur standard de double nommé x avec dix éléments.

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

En général, il est plus logique de rester sur les types de vecteurs Rcpp, car ils offrent de nombreuses méthodes pratiques qui fonctionnent comme leurs équivalents R, notamment mean(), round() et abs(). Toutefois, les vecteurs STL ont l’avantage de pouvoir changer de taille dynamiquement sans devoir recopier les données à chaque fois. Cela nous permet d’écrire un code plus simple, comme la fonction « mauvaise » du précédent exercice, tout en conservant les performances du code « bon ».

Cet exercice fait partie du cours

Optimiser du code R avec Rcpp

Afficher le cours

Instructions

  • Complétez la définition de select_positive_values_std(), une fonction basée sur les vecteurs STL pour sélectionner les nombres positifs.
    • Définissez le type de retour de la fonction comme un vecteur standard de double en utilisant std::vector<double>.
    • Définissez un vecteur standard de double, positive_x, de taille 0.
    • À l’intérieur du bloc if dans la boucle for, utilisez la méthode push_back() de positive_x pour ajouter le iᵉ élément de x.
  • good_select_positive_values_cpp() du précédent exercice est disponible dans votre espace de travail pour comparaison. Examinez la sortie de la console pour voir les vitesses relatives des deux fonctions.

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

#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)
)
*/
Modifier et exécuter le code