附加到动态内存中的数组

时间:2017-10-09 21:02:00

标签: c++ arrays dynamic-memory-allocation

使用动态内存,我试图创建一个在动态数组中存储数字的类(因此123将是arr [0] = 1,arr [1] = 2,arr [2] = 3)并且能够附加数字(例如,如果存储的数字是123,您可以添加更多数字.. 45和新数字将是12345)。

到目前为止,这是我的代码:我将如何制作追加函数?

#include "stdafx.h"
#include <iostream>

using namespace std;

int main()
{
    int *exampleArray; //new array into exsistence 

    exampleArray = new int[5]; // dynamically allocates an array of 5 ints
    for (int i = 1; i < 5; i++)
    {
        exampleArray[i] = i;
        cout << exampleArray[i] << endl;
    }

    delete exampleArray; // deleted from exsistence

    system("pause"); // to show the output
    return 0;
}

2 个答案:

答案 0 :(得分:4)

如果你使用new[]分配一个数组,那么“追加”它的唯一方法是new[]一个更大的新数组,将旧数组中的现有值复制到其中,并且然后delete[](不是delete)旧数组并更新数组指针以指向新数组。

另外,请注意,数组是0索引的。您的循环不会使用任何数据填充exampleArray[0]

例如:

int *arr = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;

...

int *newarr = new int[5];
std::copy(arr, arr+3, newarr);
newarr[3] = 4;
newarr[4] = 5;
delete[] arr;
arr = newarr;

...

delete[] arr;

您可以通过预先分配比实际需要更多的内存来优化这一点,并且只有在实际超出内存时才“增长”。例如:

int *arr = NULL;
int num = 0, cap = 0;

void append(int digit)
{
    if (num == cap)
    {
        int *newarr = new int[cap + 10];
        std::copy(arr, arr+num, newarr);
        delete[] arr;
        arr = newarr;
        cap += 10;
    }

    arr[num] = digit;
    ++num;
}

...

append(1);
append(2);
append(3);

...

append(4);
append(5);

...

delete[] arr;

话虽这么说,你要求的东西最好用std:vector代替。它是一个动态长度的容器,可以为您处理这些丑陋的细节。

例如:

std::vector<int> arr;

void append(int digit)
{
    arr.push_back(digit);
}

...

append(1);
append(2);
append(3);

...

append(4);
append(5);

...

答案 1 :(得分:0)

一个不需要您使用std::vector容器或任何其他指针的替代解决方案是使用malloc()/realloc()/free() C ++头中的cstdlib函数家族,如下所示:< / p>

int *exampleArray;
exampleArray = (int *) malloc(5 * sizeof(int));
for (int i = 1; i < 5; i++)
{
   exampleArray[i] = i;
   cout << exampleArray[i] << endl;
}
// Now to add further elements
exampleArray = (int *) realloc(7 * sizeof(int)); // Added space for 2 new elements
for (int i = 5; i < 7; i++) {
   exampleArray[i] = i;
   cout << exampleArray[i] << endl;
}
free(exampleArray);