我有一个结构数组(带有名称和数字的参数),初始数组从我创建的文档中获取元素。初始列表大小从1000开始。当列表填满时,我调用另一种我正在努力的方法。我希望它能将数据复制到一个大小翻新的数组中,然后删除旧数组。
如果我命名它:array1和array2,我的程序使用array1。我需要帮助指出将使array2作为array1工作的指针。
有没有办法将数组复制到相同或新大小的临时数组,然后将重新分配的初始数组重新分配给它?对于本练习,我不能使用向量。虽然我知道如何使用它们,并且它们在更好的情况下解决了这个问题,但我只是尝试使用数组。
using namespace std;
struct Information {
char functionality;
int SSN;
string name;
};
int numPeople = 1000;
//Gets called if the initial array (whatever size) is filled
void doubleArray(Information *array){
numPeople = numPeople * 2;
//Will now be the doubled array size
Information temp[numPeople]
for(int i = 0; i < numArray; i++){
temp[i].SSN = array[i].SSN;
temp[i].name = array[i].name;
}
//Normally makes it crash
delete[] array;
}
编辑:这就是我目前所拥有的
void doubleArray(Information *person){
numPeople = numPeople * 2;
Information* temp = new Information[numPeople];
memcpy(temp, person, numPeople);
delete[] person;
person = temp;
}
它获得numPeople = 1000(初始列表大小),但之后不久崩溃。双倍阵列是否正确?
答案 0 :(得分:1)
阵列是固定大小的。您无法更改原始阵列的容量。
{使用std::vector
}
您可以拥有指向数组的指针。并使用相同的指针。当数组已满时,您可以分配另一个数组,将旧数组项复制到新数组,删除旧数组并将数组指针指定给新数组。
{我提到了std::vector
吗?}
顺便说一下,有一个数据结构可以根据需要执行调整大小。如果我没记错的话,它是 std::vector
。试试看。 : - )
答案 1 :(得分:0)
假设您正在使用std::array
(您应该使用),那么复制数组非常容易。
std::array<myStruct, 1000> array1{};
std::array<myStruct, 2000> array2{};
// codes...
std::copy(array1.begin(), array1.end(), array2.begin())
但是,这是您只使用这两个数组的特定方案。它不会动态地使数组的大小加倍,因为您无法使用基于堆栈的数组动态地执行此操作,就像c数组[]一样。
您可以而且应该使用的是std::vector<myStruct>
。这将根据您的需要动态增长。在您向我们提供代码和更具体的问题之前,这是我可以提供的最佳建议。
答案 2 :(得分:0)
如果您不允许使用std::vector
作为您的评论之一,那么您需要查看动态分配。
size_t sz = [whatever];
// Dynamically allocate an array of size sz.
T* T_array = new T[sz];
// Do whatever...
delete[] T_array; // new[] needs to be paired with delete[].
T_array = nullptr; // Not strictly necessary, but a good idea if you have more code after.
由于动态数组的大小不需要是常量,因此可以根据需要分配内存。然后,您可以使用std::copy()
将数据从一个数组复制到另一个数组,作为Goodies mentioned。
[有关动态分配的详细信息,请参阅here。]