在C ++中动态更改数组大小

时间:2018-02-28 09:33:05

标签: c++

我需要将数组从{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;
}

3 个答案:

答案 0 :(得分:5)

问题是仅将新数组分配给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

答案 1 :(得分:0)

问题是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负责分配,重新分配和复制元素,以及释放它所使用的资源。

答案 2 :(得分:0)

既然你说C++,我建议你使用一个合适的容器,例如std::vector

如果您没有充分理由进行自己的内存管理,则应避免使用newdelete,请参阅here以获得详细说明。

使用模板增强了将repeat函数重用于double以外的其他类型的可能性。

因此,您的代码将缩减为以下内容并且更易于阅读。

#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;
}