【问题标题】:Copy array then delete original复制数组然后删除原始数组
【发布时间】:2016-03-02 22:50:11
【问题描述】:

我有一个结构数组(带有名称和数字的参数),初始数组从我制作的文档中获取元素。初始列表大小从 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(初始列表大小),但不久后崩溃。加倍数组正确吗?

【问题讨论】:

  • 请少说话,向我们展示您正在努力解决的代码...
  • 尝试谷歌搜索“memcpy”
  • @Christophe 他无法显示代码,因为他正忙于与它斗争。

标签: c++ arrays


【解决方案1】:

数组是固定大小的。您无法更改原始阵列的容量。

{使用std::vector}

你可以有一个指向数组的指针。并使用相同的指针。当数组已满时,您可以分配另一个数组,将旧数组项复制到新数组,删除旧数组并将数组指针分配给新数组。

{我提到std::vector了吗?}

顺便说一句,有一个数据结构可以根据需要执行调整大小。如果我没记错的话,是std::vector。试试看。 :-)

【讨论】:

  • 是的,我知道向量可以做到这一点,并且我知道如何使用向量来做到这一点 - 但这个练习希望我不要使用向量
【解决方案2】:

假设您使用的是std::array(您应该是),那么复制数组非常容易。

std::array<myStruct, 1000> array1{};
std::array<myStruct, 2000> array2{};
// codes...
std::copy(array1.begin(), array1.end(), array2.begin())

但是,这是您仅使用这两个数组的特定场景。它不会动态地将数组的大小加倍,因为您根本无法使用基于堆栈的数组动态地做到这一点,就像 c arrays[] 一样。

您可以并且应该使用的是std::vector&lt;myStruct&gt;。这将根据您的需要动态增长。在您向我们提供代码和更具体的问题之前,这是我可以根据所提供的信息提供的最佳建议。

【讨论】:

  • 我会在 10 分钟后到家时添加代码
【解决方案3】:

如果您不允许使用 std::vector,正如您的一位 cmets 所述,那么您将需要查看动态分配。

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。]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2021-05-12
    • 2018-01-13
    • 1970-01-01
    相关资源
    最近更新 更多