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
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
doubleusandostd::vector<double>. - Defina um vetor padrão de
double,positive_x, com tamanho0. - Dentro do bloco
ifno loopfor, use opush_back()depositive_xpara acrescentar o i-ésimo elemento dex.
- Defina o tipo de retorno da função como um vetor padrão de
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)
)
*/