在 Rcpp 和 C++ 之间转换向量(使用 Rcpp::as 或 Rcpp::wrap)是否会创建一个新的向量并复制元素?

Does converting vectors between Rcpp and C++ (using Rcpp::as or Rcpp::wrap) create a new vector and copy elements?

据我了解,在 Rcpp 和 C++ 之间转换向量会创建新的向量,如下所示。我的理解对吗?

将 Rcpp 向量转换为 C++ 向量时,我们使用 Rcpp::as<T>()(例如 Rcpp::as<std::string> 转换为 Rcpp::CharacterVector)。 std::vector<std::string> 被创建,原始 Rcpp 元素被复制到 C++ 向量中作为 std::string。 这意味着修改新创建的 C++ 向量元素不会影响原始 Rcpp 向量元素。

将 C++ 向量转换为 Rcpp 向量时,我们使用 Rcpp::wrap()。 创建相应类型的 Rcpp 向量,并将 C++ 元素作为 Rcpp 对象复制到 Rcpp 向量中。这意味着修改新创建的 Rcpp 向量元素不会影响原始 C++ 向量元素。

正确,以下函数执行转换:

// conversion from R to C++
Rcpp::as<T>();
// conversion from C++ to R
Rcpp::wrap();

简而言之,将数据从 Rcpp 对象移动到 C++ 向量中,反之亦然会导致创建副本。这已在此处进行了一些解释:

Declare a variable as a reference in Rcpp

有关模板的更多信息,请参阅 Rcpp Extending 小插图。

有关从 Rcpp::*Vectorstd::vector<T> 的成本的详细信息,请参见此处:

避免复制的一种方法是尽可能重新使用内存。此处暗示: