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

3
在我看来,将Rcpp向量转换为C++向量的方法如下:使用Rcpp::as<T>()(例如,对于Rcpp::CharacterVector,使用Rcpp::as<std::string>)创建一个std::vector<std::string>,并将原始的Rcpp元素复制到C++向量中作为std::string。这意味着修改新创建的C++向量元素不会影响原始的Rcpp向量元素。
将C++向量转换为Rcpp向量时,我们使用Rcpp::wrap()。创建与相应类型对应的Rcpp向量,并将C++元素作为Rcpp对象复制到Rcpp向量中。这意味着修改新创建的Rcpp向量元素不会影响原始的C++向量元素。

2
这取决于R端的类型和C++端的类型。 - Dirk Eddelbuettel
"这要看情况而定……好的,我想我需要以更具体的方式提问。谢谢。" - toshi-san
1个回答

7

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

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

简言之,将数据从Rcpp对象移动到C++向量或者反过来都会导致复制。这在此处已经有所解释: 在Rcpp中将变量声明为引用 关于模板的更多信息,请参阅Rcpp扩展手册。
有关从Rcpp::*Vectorstd::vector<T>成本的详细信息可以在此处找到: 我应该优先选择Rcpp::NumericVector还是std::vector? 避免复制的一种方法是尽可能重用内存。这在此处有所提及: 在Rcpp中决定NumericVector和arma::vec之间的选择

作为对这个问题的回答,Rcpp的作者说“这取决于情况”。 - toshi-san
我有点困惑,但我需要以更具体的方式提问。 - toshi-san

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接