시작하기무료로 시작하기

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_xpush_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)
)
*/
코드 편집 및 실행