STL 벡터
standard template library(stl)는 유연한 알고리즘과 자료 구조를 제공하는 C++ 라이브러리입니다. 예를 들어, stl의 double 벡터는 Rcpp의 NumericVector와 유사한 "네이티브 C++" 대응입니다. 다음 코드는 열 개의 원소를 가진 표준 double 벡터 x를 생성합니다.
std::vector<double> x(10);
일반적으로는 R과 유사하게 동작하는 많은 편의 메서드(mean(), round(), abs() 등)를 사용할 수 있으므로 Rcpp 벡터 타입을 사용하는 편이 더 합리적입니다. 하지만 stl 벡터의 장점은 매번 데이터를 복사하지 않고도 크기를 동적으로 변경할 수 있다는 점입니다. 덕분에 이전 연습 문제의 "나쁜" 함수처럼 더 단순한 코드를 작성하면서도 "좋은" 코드의 성능을 유지할 수 있습니다.
이 연습은 강의의 일부입니다
Rcpp로 R 코드 최적화하기
연습 안내
- 양수를 선택하는 stl 벡터 기반 함수
select_positive_values_std()의 정의를 완성하세요.- 함수 반환 타입을
std::vector<double>을 사용해 표준 double 벡터로 지정하세요. - 크기가
0인 표준 double 벡터positive_x를 정의하세요. for루프의if블록 안에서,positive_x의push_back()을 사용해x의 i번째 원소를 추가하세요.
- 함수 반환 타입을
- 비교를 위해 이전 연습 문제의
good_select_positive_values_cpp()가 작업 공간에 준비되어 있습니다. 두 함수의 상대적 속도를 확인하려면 콘솔 출력을 살펴보세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
#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)
)
*/