如何使用带双*指针的push_back

时间:2016-06-24 07:15:39

标签: c++ arrays pointers push-back

我在c ++中有以下功能

void LocatePulseEdges(int points, double* signal_x, double* signal_y, double* derivative, double threshold, double* left_edge, double* right_edge){
    for (int i=0; i<points; i++){
        if(signal_y[i]<threshold){
            left_edge.push_back(signal_x[i]);
        }
    }
}

当我编译它时,我收到错误

In function ‘void LocatePulseEdges(int, double*, double*, double*, double, double*, double*)’:
error: request for member ‘push_back’ in ‘left_edge’, which is of non-class type ‘double*’

由于我是c ++的新手,显然我试图了解指针以及如何使用它们,我无法理解为什么我不能使用push_back

我还尝试使用(*left_edge)(*signal_y[i]),但正如预期的那样,它不合适......

任何想法或帮助都会受到欢迎!

修改

我修改了代码如下

void LocatePulseEdges(int points, double* signal_x, double* signal_y, double* derivative, double threshold, vector<double> left_edge, vector<double> right_edge){
    for (int i=0; i<points; i++){
        if(signal_y[i]<threshold){
            left_edge.push_back(signal_x[i]);
        }
    }
}

然后在我的代码中我调用这个函数

void Analyze(unsigned int first_run, unsigned int last_run, unsigned int last_segment){
    double* x          = new double[points];           // SIZE limited only by OS/Hardware
    double* y          = new double[points];
    double* derivative = new double[points];
    std::vector<double> left_edge;
    std::vector<double> right_edge;

    Function_to_Fill_X_and_Y_and_derivative();

    LocatePulseEdges(points, x, y, derivative, -0.5*RMS, left_edge, right_edge);


}

虽然我没有编译错误,但是一旦调用该函数,程序就会崩溃。

2 个答案:

答案 0 :(得分:3)

这里的问题是您使用的是left_edge,就好像它是listvector之类的容器,它只是double *,即指向double的指针,或者可能(可能是来自混淆的地方)double的数组。即使它是后者,也不能以这种方式添加元素,数组的长度是固定的。最后,你必须“记住”每个数组的长度,因为C ++不会为你做那个。

扩展数组的方法是:

  1. 使用new
  2. 分配更多空间
  3. 复制旧空间的值
  4. 并将新值添加到新空间。
  5. 因此,例如,假设您使用一个元素 x 创建数组:

    double * left_edge;
    int length = 1;
    left_edge = new double[ length ];
    left_edge[ 0 ] = x;
    

    然后你需要更多空间,一个新元素 x

    double * new_space = new double[ length + 1 ];
    
    for (int i = 0; i < length; ++i) {
        new_space[ i ] = left_edge[ i ];
    }
    
    new_space[ length ] = x;
    ++length;
    delete[] left_edge;
    left_edge = new_space;
    

    调用std::vector<double>时,push_back()对您来说究竟是什么。唯一的事情是你必须从那个开始就定义它,并将它作为参考传递给函数LocatePulseEdges

    std::vector<double> left_edge;
    

    如果您要在最后添加,那么std::vector<>就是答案。如果要在中间插入,则应选择std::list<>

    希望这有帮助。

答案 1 :(得分:1)

push_back是std :: vector类的方法。您应该考虑使用std::vector<double>代替。如果您使用double*,则必须这样做:

left_egde[index] = signal_x[i] ;
index++ ;

正确初始化索引。这比std :: vector安全性低,因为在声明

时需要分配足够的内存
double *left_edge = new double[whatever_lenght] ;