在 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::*Vector
到 std::vector<T>
的成本的详细信息,请参见此处:
避免复制的一种方法是尽可能重新使用内存。此处暗示:
据我了解,在 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::*Vector
到 std::vector<T>
的成本的详细信息,请参见此处:
避免复制的一种方法是尽可能重新使用内存。此处暗示: