为什么使用动态数组而不是常规数组?

Why use a dynamic array instead of a regular array?

以下代码用于演示如何在动态数组中插入新值:

#include <iostream>

int main()
{
    int* items = new int[5] {1, 2, 3, 4, 5}; // I have 5 items

    for (int i = 0; i < 5; i++)
        std::cout << items[i] << std::endl;

    // oh, I found a new item. I'm going to add it to my collection.
    // I do this by
    // (1) allocating a bigger dynamic array
    // (2) copying the existing elements from the old array to the new array
    // (3) deleting the old array, redirecting its pointer to the new array
    int* items_temp = new int[6];
    for (int i = 0; i < 5; i++)
       items_temp[i] = items[i];
    items_temp[5] = 42;
    delete[] items;
    items = items_temp;

    for (int i = 0; i < 6; i++)
        std::cout << items[i] << std::endl;

    delete[] items;
}

我对在常规数组上使用它的必要性感到困惑。我不能用常规数组做同样的事情吗?基本上,您只需定义一个更大尺寸的新数组,并将前一个数组中的元素移动到这个新数组中。为什么在这里使用动态数组更好?

你是对的,你正在看的例子并不能很好地证明动态数组的必要性,但是如果不是从 5->6 开始,我们不知道我们找到了多少项目直到我们需要添加直到代码实际上是 运行?

需要在编译时以已知大小构造常规数组

int foo [5] = { 16, 2, 77, 40, 12071 };

但动态数组可以在运行时指定大小

int* Arrary(int size) {
    return new int[size];
}

因此,如果您不知道数组的大小,或者它可能需要 grow/shrink,您需要使用动态数组(或者更好的是只使用 std::vector)。

假设您想多次执行您提到的操作。

for(int i = 0; i < some_val; ++i)
{
    int val_to_add;
    std::cin >> val_to_add;

    int* new_arr = new int[old_size + 1]; // the value is suppsoed to be big in order to indicate that it takes much memory.
    copy_old_to_new(new_arr, old_arr); //some function which does the copying. 

    new_arr[old_size + 1] = val_to_add;
    delete[] old_arr;
    old_arr = new_arr;
}

现在想想如果我们尝试对静态数组做同样的事情会发生什么。

  1. 我们无法删除old_arr分配的内存,程序会占用大量内存。
  2. 我们将无法构造一个可在循环外访问的数组,这显然不是预期的。

在您的示例中,动态数组的使用如何符合您的意图并不十分清楚。因此,如果您觉得没有动态数组也可以做同样的事情,那就不用它们吧。