C++ 如何使用R和Rcpp删除递归的NumericVector中的元素
我试图了解更多关于如何使用Rcpp包进行R的信息,所以我开始使用Rcpp测试基本的排序算法。 我从哈德利·威克姆的教程开始 我以这种方式成功地实现了插入排序:C++ 如何使用R和Rcpp删除递归的NumericVector中的元素,c++,r,recursion,rcpp,insertion-sort,C++,R,Recursion,Rcpp,Insertion Sort,我试图了解更多关于如何使用Rcpp包进行R的信息,所以我开始使用Rcpp测试基本的排序算法。 我从哈德利·威克姆的教程开始 我以这种方式成功地实现了插入排序: library(Rcpp) vetor<-sample(100) vetor cppFunction(" NumericVector insertionsortRC(NumericVector vetor, int n) { double aux; int i; if(n&
library(Rcpp)
vetor<-sample(100)
vetor
cppFunction("
NumericVector insertionsortRC(NumericVector vetor, int n) {
double aux;
int i;
if(n>1) {
insertionsortRC(vetor,n-1);
aux=vetor[n-1];
i=n-1;
while(vetor[i-1]>aux && i>=0 ) {
vetor[i]=vetor[i-1];
i--;
}
vetor[i]=aux;
}
return vetor;
}
")
cppFunction("
NumericVector insertionsortRC(NumericVector vetor) {
int n = vetor.size();
double aux;
int i;
if(n>1) {
vetor.erase(n-1);
insertionsortRC(vetor);
aux=vetor[n-1];
i=n-1;
while(vetor[i-1]>aux && i>=0 ) {
vetor[i]=vetor[i-1];
i--;
}
vetor[i]=aux;
}
return vetor;
}
")
我认为这不是一个好主意,似乎我从内存中删除了元素,并且在递归调用之后无法恢复它。我还认为问题可能是
在vetor上。擦除(n-1);行,尝试删除(n);它编译了,但根本不起作用
使用vetor.erase(n);我在R中得到以下错误:
插入端口RC(vetor)
*在“/usr/lib/R/bin/exec/R”中出错:malloc():内存损坏:0x098db548*
使用vetor.erase(n-1);它得到了一个奇怪的输出:
插入端口RC(vetor)
[1] 3.607393e-313.300000e+01 3.100000e+01 8.600000e+01 2.500000e+01 7.000000 E+01
[7] 4.000000e+018.800000e+018.100000e+011.300000e+018.500000e+018.700000e+01
[13] 3.900000e+016.000000e+016.400000e+011.000000e+018.200000e+018.900000e+01
[19] 1.400000e+01 6.600000e+01 3.600000e+01 1.500000e+01 9.600000e+01 2.600000e+01
[25]400000e+005.400000e+012.900000e+018.300000e+015.500000e+016.800000e+01
[31]9.100000e+01.6.000000e+01.000000e+02.5.100000e+01.7.000000e+00.5.300000e+01
[37]9.900000e+01 6.500000e+01 2.300000e+01 9.400000e+01 5.700000e+01 9.000000 E+01
[43]3.200000e+01 4.700000e+01 1.600000e+01 5.000000 E+01 2.800000e+01 3.000000 E+00
[49]9.800000e+01 1.100000e+01 1.800000e+01 7.600000e+01 6.300000e+01 7.700000e+01
[55]7.400000e+01 4.900000e+01 8.000000e+00 9.700000e+01 1.200000e+01 2.700000e+01
[61]3.500000e+017.900000e+018.000000e+012.000000e+016.700000e+019.300000e+01
[67]50000E+005.600000e+019.000000e+003.700000e+012.400000e+019.200000e+01
[73]6.900000e+01 3.800000e+01 4.400000e+01 1.700000e+01 4.600000e+01 4.300000e+01
[79]3.400000e+01 1.900000e+01 2.000000 E+00 9.500000e+01 7.200000e+01 1.000000 E+00
[85]6.100000e+01 4.100000e+01 6.200000e+01 2.200000e+01 4.200000e+01 2.100000e+01
[91]8.400000e+01 4.800000e+01 7.800000e+01 7.300000e+01 3.000000e+01 5.900000e+01
[97]5.800000e+01 5.200000e+01 7.500000e+01
有人能告诉我:
1是否可以像这样使用Rcpp和R实现这段代码,只使用一个参数(数据向量)调用函数?
2如何正确操作?简要介绍:
vetor.erase(n)
是未定义的行为。第一个索引是0
,最后一个是n-1
<代码>擦除不进行边界检查,因为每个人都必须付出代价。相反,它假定,C++中常见的是函数被正确使用。
了解std::sort
。它可能比home-backed排序实现更高效,尤其是插入排序
Rcpp向量有一种排序方法。因此,NumericVector
可以自行排序
了解属性,即使用Rcpp属性
vignette,使用起来更简单,这将为您提供一种处理默认参数的方法 尝试:vector.erase(vector.begin()+desiredElement)
那会解决你的问题
NumericVector类型似乎与std::vector
相关,至少在处理数据插入和删除的方式上是如此,这意味着您必须使用迭代器(但是,我不是Rcpp专家)
布莱恩