Comece agoraComece grátis

Vetores STL

A standard template library (stl) é uma biblioteca C++ com algoritmos e estruturas de dados flexíveis. Por exemplo, o vetor de double da stl é como um equivalente "C++ nativo" do NumericVector do Rcpp. O código a seguir cria um vetor padrão de double chamado x com dez elementos.

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

Geralmente, faz mais sentido ficar com os tipos de vetor do Rcpp, porque eles oferecem muitos métodos práticos que funcionam como seus equivalentes em R, incluindo mean(), round() e abs(). No entanto, os vetores da stl têm a vantagem de poder mudar de tamanho dinamicamente sem pagar o custo de copiar os dados a cada vez. Isso permite escrevermos um código mais simples, como a função "ruim" do exercício anterior, mantendo o desempenho do código "bom".

Este exercicio faz parte do curso

Otimizando código R com Rcpp

Ver curso

Instruções do exercicio

  • Complete a definição de select_positive_values_std(), uma função baseada em vetor da stl para selecionar números positivos.
    • Defina o tipo de retorno da função como um vetor padrão de double usando std::vector<double>.
    • Defina um vetor padrão de double, positive_x, com tamanho 0.
    • Dentro do bloco if no loop for, use o push_back() de positive_x para acrescentar o i-ésimo elemento de x.
  • good_select_positive_values_cpp() do exercício anterior está disponível no seu workspace para comparação. Examine a saída do console para ver as velocidades relativas das duas funções.

exercicio interativo prático

Tente este exercicio completando este código de exemplo.

#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)
)
*/
Editar e Executar Código