更改数组大小C++

3z6pesqy  于 2023-02-26  发布在  其他
关注(0)|答案(4)|浏览(215)

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

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

我有一个向数组中插入内容的方法;但是,如果它检测到它将溢出数组,我需要调整数组的大小(没有向量).我一直在阅读关于堆栈溢出的问题,但是答案似乎不适用于我,因为我需要将旧数组中的数据复制到新数组中.另外,如果我在方法中创建一个更大的新数组,然后将数据复制到新数组中,一旦方法结束,数组将消失,但我需要它再次成为一个全局变量,这样我的所有方法都可以看到它...我应该如何继续?谢谢

7fhtutme

7fhtutme1#

new分配的内存在方法结束后不会消失。
你可以使用引用返回指向新数组的指针:void f(int *&ptr, size_t &size).
此外,请注意,您需要在使用后手动清除内存。例如:

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

sc4hvdpw2#

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

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循环。

bihw5rsg

bihw5rsg3#

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

  • 当请求的大小大于当前数组大小时,自动处理调整大小。
  • 调整大小时,他们可以将原始内容复制到新空间,然后立即删除旧的分配。
  • 有一个非全局变量的方式机制,它们可以跟踪数组指针和当前大小。

thingstd::vector非常相似,如果不允许使用,您可能需要像std::vector这样的manage a dynamic allocated resource,您可以在该答案链接中参考其实现。
如果最终你需要将它 Package 在一个类中,请确保遵循三大规则(C++11中的5条规则)

cwxwcias

cwxwcias4#

如果你有char/int/doubles数组,或者其他一些基本的数据类型,或者只有这些变量的类,你可以使用realloc。http://www.cplusplus.com/reference/cstdlib/realloc/

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

重新分配自动为新数组分配空间(可能分配到内存中的同一位置),并从给定数组复制所有数据。“内存块的内容将保留为新旧大小中较小的一个,即使该块被移动到新位置。”
示例:

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

相关问题