在C 中动态更改数组大小

Dynamically changing array size in C++

本文关键字:数组 动态      更新时间:2023-10-16

我需要将数组从 {4, 2 ,5}转换为 {4, 2, 5, 4, 2, 5}。这是我的输出:{4, 2, 5, 3.21143e-322, 0, 2},显然是不正确的。但是我似乎无法在逻辑中弄清楚这个问题。也许另一个观点可以找到这个问题。


这是我的代码:

void repeatArray(double* oldArray, int size) {
    int newSize = size * 2;
    double* newArray = new double[newSize];
    for (int i = 0; i < size; i++) {
        newArray[i] = oldArray[i];
    }
    for (int i = 0; i < size; i++) {
        newArray[size+i] = oldArray[i];
    }
    oldArray = newArray;
    delete [] newArray;
}
int main() {
    double* oldArray = new double[3];
    oldArray[0] = 4;
    oldArray[1] = 2;
    oldArray[2] = 5;
    repeatArray(oldArray, 3);
    for (int i=0; i<6; i++)
        cout << oldArray[i] << endl;
    delete []oldArray;
    return 0;
}

问题是,仅将新数组分配给repeatArray()中的指针不会从外部更改。

您在repeatArray()中可以做的是返回新创建的数组。

double* repeatArray(double* oldArray, int size) {
    int newSize = size * 2;
    double* newArray = new double[newSize];
    for (int i = 0; i < size; i++) {
        newArray[i] = oldArray[i];
    }
    for (int i = 0; i < size; i++) {
        newArray[size+i] = oldArray[i];
    }
    delete [] oldArray;
    return newArray;
}

main()

oldArray = repeatArray(oldArray, 3);


一种可能更好的方法是使用根据需要自动调整大小的std::vector

问题是repeatArray参数是该函数本地的,因此,如果更改其值,则将更改超过函数调用。您可以使用指针double** oldArray的指针来更改oldArray指向的内容,或返回新数组位置的指针。

但是,这是C++,您可以在其中使用STL容器。您的代码将变得更加简单和可读。

void repeat( std::vector<double>& numbers ) {
   // Reserve rellocates the vector if there is not enough space
   // otherwise, the iterators first and last could be invalidated.
   numbers.reserve( numbers.size() * 2 );
   auto first = numbers.begin();
   auto last = numbers.end();
   std::copy( first, last, std::back_inserter(numbers) );
}
int main() {
   std::vector<double> nums({4, 2, 5});
   repeat(nums);
   for( double num : nums ) {
      std::cout << num << 'n';
   }
   return 0;
}

std::vector负责您的分配,重新分配和元素的副本,以及其使用的资源的交易。

由于您说C++,我建议您使用适当的容器,例如std::vector

如果您没有充分的理由进行自己的内存管理,那么您应该避免使用newdelete,请参阅此处以获取详细说明。

使用模板增强了与double以外的其他类型重复使用repeat功能的可能性。

因此,您的代码被简化为以下内容,并且更易于阅读。

#include <vector>
#include <iostream>
template <typename T>
std::vector<T> repeat(const std::vector<T>& originalVec) {
    auto repeatedVec = originalVec;
    repeatedVec.insert(repeatedVec.end(), originalVec.begin(), originalVec.end());
    return repeatedVec;
}
int main() {
    std::vector<double> oldArray {4,2,5};
    const auto newArray = repeat(oldArray);
    for (const auto item : newArray) {
        std::cout << item << std::endl;
    }
    return 0;
}