更改数组大小C ++

时间:2017-02-15 00:26:14

标签: c++ arrays pointers resize

我创建了一个数组指针作为全局变量,如下所示:

T *bag;
        bag = new T[size];

我有一个方法可以将数据插入到数组中;但是,如果它检测到它会溢出数组,我需要调整数组的大小(没有向量)。我已经在堆栈溢出中读到了这个问题,但答案似乎并不适用于我,因为我需要将旧数组中的数据复制到新数组中。另外,如果我在方法中创建一个更大尺寸的新数组然后将数据复制到新数组,一旦方法结束,数组将消失,但我需要它再次成为一个全局变量所以我的所有方法可以看到......我该怎么办? 谢谢

4 个答案:

答案 0 :(得分:2)

要调整数组大小,您必须分配一个新数组并将旧元素复制到新数组,然后删除旧数组。

T * p_bag;
p_bag = new T[old_size];
//...
T * p_expanded_bag = new T[new_size];
for (unsigned int i = 0; i < old_size; ++i)
{
  p_expanded_bag[i] = p_bag[i];
}
delete[] p_bag;
p_bag = p_expanded_bag;

您可以使用std::copy代替for循环。

答案 1 :(得分:1)

new分配的内存在方法结束后不会消失。

您可以通过usung引用返回指向新数组的指针:void f(int *&ptr, size_t &size)

另外,请注意,您需要手动清除内存,然后才能使用它。例如:

int* newArray = new int[newSize];
... copying from old array ...
int* temp = oldArray;
oldArray = newArray;
delete[] temp;

答案 2 :(得分:0)

您需要的thing可以执行以下操作

  • 当请求的尺寸大于当前阵列尺寸时,自动处理调整大小。

  • 调整大小时,他们可以将原始内容复制到新空间,然后立即删除旧分配。

  • 有一种非全局变量的方式机制,它们可以跟踪数组指针和当前大小。

thingstd::vector非常相似。如果不允许使用,您可能需要自己manage a dynamic allocated resource std::vector。您可以在该答案链接中引用该实现。

如果最终需要将它包装在一个类中,请确保遵循大3规则(C ++ 11中的5条规则)

答案 3 :(得分:-1)

如果你有chars / ints / double数组......或者其他一些基本数据类型或只有那些变量的类(例如字符串数组不起作用),你可以使用c中的realloc。 http://www.cplusplus.com/reference/cstdlib/realloc/

bag = (T*) realloc(bag, new_size * sizeof(T));

Realloc自动为新阵列分配空间(可能在内存中的相同位置)并复制给定阵列中的所有数据。 “即使将块移动到新位置,内存块的内容也会保留到新旧尺寸中的较小者。”

示例:

#include <stdio.h>      /* printf*/
#include <stdlib.h>     /* realloc, free */

#include <iostream>

int main()
{
    int old_size = 5;
    int new_size = 10;

    int *array = new int[old_size];

    printf("Old array\n");
    for (int i=0; i<old_size; i++) {
        array[i] = i;   
        printf("%d ", array[i]);
    }
    printf("\nArray address: %d\n", array);

    array = (int*) realloc(array, new_size * sizeof(int));

    printf("New array\n");
    for (int i=0; i<new_size; i++)
        printf("%d ", array[i]);
    printf("\nArray address: %d\n", array);

    free(array);
    return 0;
}