附加到动态内存中的数组
Appending to an array in Dynamic Memory
使用动态内存,我试图制作一个 class 将数字存储在动态数组中(因此 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;
}
如果您使用 new[]
分配一个数组,"append" 的唯一方法是 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;
您可以通过预先分配比您实际需要更多的内存来稍微优化一下,并且只有 "grow" 当您实际超过该内存时才这样做。例如:
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);
...
不需要您使用 std::vector
容器或任何其他指针的替代解决方案是使用 cstdlib
C++ [=16] 中的 malloc()/realloc()/free()
系列函数=]如下:
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);
使用动态内存,我试图制作一个 class 将数字存储在动态数组中(因此 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;
}
如果您使用 new[]
分配一个数组,"append" 的唯一方法是 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;
您可以通过预先分配比您实际需要更多的内存来稍微优化一下,并且只有 "grow" 当您实际超过该内存时才这样做。例如:
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);
...
不需要您使用 std::vector
容器或任何其他指针的替代解决方案是使用 cstdlib
C++ [=16] 中的 malloc()/realloc()/free()
系列函数=]如下:
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);