C++ 创建矢量类

C++ Created Vector class

本文关键字:创建 C++      更新时间:2023-10-16

void expand((

此函数将使矢量的容量加倍。此函数应为动态分配的阵列重新分配内存并更新容量值。在调用 expand(( 之前,请注意正确处理容量为 0 的情况。

确保不要在此处创建内存泄漏。

无效扩展(未签名金额(

此函数将通过传入的数量扩展向量的矢量容量。此函数应为动态分配的阵列重新分配内存并更新容量值。

确保不要在此处创建内存泄漏。

我正在尝试回答完成这些功能,但我似乎无法让它工作。这是我到目前为止的代码。

void IntVector::expand() {
    cap = cap * 2;
    int *temp = new int[cap];
    for(unsigned i = 0; i < sz; ++i) {
        temp[i] = data[i];
    }
    delete [] data;
}
void IntVector::expand(unsigned amount) {
    cap = cap + amount;
    int *temp = new int[cap];
    for(unsigned i = 0; i < sz; ++i) {
        temp[i] = data[i];
    }
    delete [] data;
}

我也有私有数据字段:

-unsigned sz:存储 IntVector 的大小(当前正在使用的元素数(。

-无符号上限:存储数组的大小

-int *data:存储动态分配的整数数组的地址

我似乎无法弄清楚问题所在。

非常感谢。

add data = temp; 在 delete[] 数据之后;实际上,您需要做更多的事情来处理分配内存的失败。

有两个问题:

  1. 无法从temp分配data成员:
  2. 在确定可以成功分配内存之前更改成员变量(如 cap(。

对于上面的第 2 项,如果new[]引发异常,则表示您通过更改cap成员损坏了它。

以下是更正:

void IntVector::expand() {
    int *temp = new int[cap * 2];
    cap *= 2;  // <-- Set this after you've allocated
    for(unsigned i = 0; i < sz; ++i) {
        temp[i] = data[i];
    }
    delete [] data;
    data = temp;  // <--- Failed to do this
}
void IntVector::expand(unsigned amount) {
    int *temp = new int[cap + amount];
    cap += amount;  // <-- Set this after you've allocated
    for(unsigned i = 0; i < sz; ++i) {
        temp[i] = data[i];
    }
    delete [] data;
    data = temp;  // <--- Failed to do this
}

您忘记将分配的temp分配给data

并且你应该检查amount是否小于0,并且不需要在两个函数中实现相同的逻辑。

void IntVector::expand() {
    expand(cap);
    ~~~~~~~~~~~~
}
void IntVector::expand(unsigned amount) {
    if (amount <= 0) return;
    ~~~~~~~~~~~~~~~~~~~~~~~~
    int *temp = new int[cap + amount];
    for(unsigned i = 0; i < sz; ++i) {
        temp[i] = data[i];
    }
    cap = cap + amount;
    delete [] data;
    data = temp;
    ~~~~~~~~~~~~
}