当数组大小已在C中修复时,我们如何插入数组元素?

时间:2014-04-11 18:02:30

标签: c data-structures

当我读到链接列表之间的差异时数组,我总是在许多网站上看到,将一个元素插入一个数组是非常昂贵的,因为我们需要做大量的数据移动。但有一点我一直都不了解的是我们如何在插入时为另外一个元素创建空间,因为数组的大小(或数组中元素的数量)在编译时是固定的。任何人都可以告诉我们如何将元素插入到固定大小的数组中。在C中是否有任何称为动态数组的概念?

4 个答案:

答案 0 :(得分:1)

在C中,没有" native"动态数组的概念。您可以通过声明创建固定长度数组:

int myArray[10];

或通过malloc / calloc动态:

int* myArray = malloc(10, sizeof(int));

"插入"进入固定阵列是如此昂贵,是因为你需要:

  1. 创建一个更大的新阵列。
  2. 将旧数据复制到新数组中。
  3. 将新元素插入新数组中的适当位置。
  4. 您的选择是创建自己的存储机制(即:堆栈,队列,链表),或实现此类的现有实现。

答案 1 :(得分:1)

确实存在动态数组的概念。您只需要一个指针并使用malloc保留所需大小的内存。您还需要跟踪您拥有的元素数量。

int* my_array = malloc(10 * sizeof(int));
int n_used_elements = 0; // Need to keep track of the used elements and the size
int my_array_size = 10;  // reserved size

但是,当你超过数组中的元素数量时,你需要再次保留整个元素并将其再次复制到新的保留内存中,这也是代价高昂的。

通常,当使用数组来动态增加和缩小数据量时,最典型的方法之一就是有以下想法:当你超过数组的大小时,你的大小加倍(即你不只是添加一个更多,但预留了额外数量的元素,你可能需要再次增加数组的大小),复制旧的小元素并继续前进。每当你超过,你的尺寸加倍。另一方面,为了避免浪费内存,如果你占用的元素数量少于一定数量,有时你的数量只有数组的一半。

在数组中插入新元素是非常昂贵的,因为您必须在插入的索引之后将所有元素移位到右侧的一个位置。阵列越大,其成本就越大(即它与阵列的大小成正比)。而且你总是需要考虑超过矢量大小的可能性。

答案 2 :(得分:0)

C中没有内置动态数组。如果您需要动态数组,则无法转义指针

typedef struct {
  int *array;
  size_t used;
  size_t size;
} Array;

void insertArray(Array *a, int element) {
  if (a->used == a->size) {
    a->size *= 2; // double the size when exceeding the size of the array
    a->array = (int *)realloc(a->array, a->size * sizeof(int));
  }
  a->array[a->used++] = element;
}

查看this post了解更多详情和示例。

答案 3 :(得分:0)

如果您有一个像int a[10];这样的数组(并且您使用了所有10个元素),则无法调整其大小以适应其他元素。

对于动态大小,您必须使用指针int* a;,使用a = malloc(10*sizeof(int));为自己分配内存,并在插入中间时注意移动元素。