如何使用 push_back 双*指针

How to use push_back with double* pointer

我在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);


}

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

push_back是std::vectorclass的一个方法。您应该考虑改用 std::vector<double>。如果你使用 double*,你必须这样做:

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

索引已正确初始化。这不如 std::vector 安全,因为在声明

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

这里的问题是你在使用 left_edge 就好像它是一个容器,例如 listvector,而它只是一个 double *,即,指向 double 的指针,或者(可能这是混淆的来源)double 的数组。即使是后者,也不能那样添加元素,数组的长度是固定的。最后,您必须 "remember" 每个数组的长度,因为 C++ 不会为您这样做。

扩展数组的方法是:

  1. 分配更多space新的,
  2. 复制旧 space、
  3. 的值
  4. 并将新值添加到新的 space。

因此,例如,假设您使用一个元素创建数组 x:

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

那么你需要更多space,一个新元素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<> is the answer. If you are going to insert in the middle, then you should choose std::list<>

希望这对您有所帮助。