C++ 如何使用R和Rcpp删除递归的NumericVector中的元素

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&

我试图了解更多关于如何使用Rcpp包进行R的信息,所以我开始使用Rcpp测试基本的排序算法。 我从哈德利·威克姆的教程开始

我以这种方式成功地实现了插入排序:

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如何正确操作?

简要介绍:

  • 好消息是,您的编译工作正常

  • 不太好的消息是错误。可能是代码中的逻辑错误

  • 一般来说,向NumericVector等添加或删除是个坏主意。这些都很浅 直接连接到同一对象的R内存的类型(“无副本”)。这意味着 扩展或删除是昂贵的。考虑使用STL <代码> STD::vector < /代码>。所有这些都记录在案

  • 有几件事:

    vetor.erase(n)
    是未定义的行为。第一个索引是
    0
    ,最后一个是
    n-1
    <代码>擦除不进行边界检查,因为每个人都必须付出代价。相反,它假定,C++中常见的是函数被正确使用。 了解
    std::sort
    。它可能比home-backed排序实现更高效,尤其是插入排序

    Rcpp向量有一种排序方法。因此,
    NumericVector
    可以自行排序

    了解属性,即使用
    Rcpp属性
    vignette,使用起来更简单,这将为您提供一种处理默认参数的方法

    尝试:
    vector.erase(vector.begin()+desiredElement)

    那会解决你的问题

    NumericVector类型似乎与
    std::vector
    相关,至少在处理数据插入和删除的方式上是如此,这意味着您必须使用迭代器(但是,我不是Rcpp专家)

    布莱恩