我创建了一个数组指针作为全局变量,如下所示:
T *bag;
bag = new T[size];
我有一个方法可以将东西插入数组;但是,如果它检测到它会溢出数组,我需要调整数组的大小(没有向量)。我一直在阅读有关堆栈溢出的这个问题,但答案似乎并不适用于我,因为我需要将旧数组中的数据复制到新数组中。此外,如果我在方法内创建一个更大的新数组,然后将数据复制到新数组,一旦方法结束,该数组就会消失,但我需要它再次成为一个全局变量,所以我的所有方法可以看到它...我应该如何进行? 谢谢
要调整数组的大小,您必须分配一个新数组并将旧元素复制到新数组,然后删除旧数组。
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
循环。
由
new
分配的内存不会在你的方法结束后消失。
您可以使用引用返回指向新数组的指针:
void f(int *&ptr, size_t &size)
.
另外请注意,使用后需要手动清空内存。例如:
int* newArray = new int[newSize];
// copying from old array:
int* temp = oldArray;
oldArray = newArray;
delete[] temp;
你需要的
thing
可以做以下事情
当请求的大小大于当前数组大小时,自动处理大小调整。
调整大小时,他们可以将原始内容复制到新空间,然后立即删除旧分配。
有一个非全局变量的方式机制,他们可以跟踪数组指针和当前大小。
thing
与std::vector
非常相似。如果不允许使用,您可能需要自己管理动态分配的资源,如std::vector
。您可以在该答案链接中引用实现。
如果最终你需要将它包装在一个类中,请确保遵循三大规则(C++11 中的 5 条规则)
如果你有字符数组/整数/双精度数组,你可以使用 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;
}