问题描述
在我的作业中,我将使用动态数组找到一个总和网格。这是我没有使用动态数组的代码(我使用了二维数组)。我使大小取决于用户输入。有人可以帮助我理解并在这段代码中实现动态数组吗?如果您需要,我可以发布我的所有代码,以帮助您了解我正在尝试做什么。
void sumGrid(int array[],int& Size)
{
cout << "Sum Grid" << endl;
int a2d[Size][Size];
for (int i = 0; i < Size; i++)
{
for (int j = 0; j < Size; j++)
{
a2d[i][j] = array[i] + array[j];
}
}
cout << " " << setw(7);
for (int j = 0; j < Size; j++)
{
cout << setw(7) << array[j] << ' ';
}
cout << endl;
for ( int k = 0; k < Size; k++)
{
cout << array[k] << ' ';
for (int l = 0; l < Size; L++)
{
cout << setw(7) << a2d[k][l] << ' ';
}
cout << endl;
}
cout << endl;
}
Sum Grid
1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
解决方法
语句 int a2d[Size][Size];
定义了一个可变长度数组,因为 Size
不是一个编译时常量。 VLA 是 not part of standard C++,因此应避免使用它们。分配动态数组的正确且标准的方法是使用 new[]
运算符(请参阅 1、2),例如:
void sumGrid(int array[],int& Size)
{
cout << "Sum Grid" << endl;
int **a2d = new int*[Size];
for (int i = 0; i < Size; i++)
{
a2d[i] = new int[Size];
for (int j = 0; j < Size; j++)
{
a2d[i][j] = array[i] + array[j];
}
}
cout << " " << setw(7);
for (int j = 0; j < Size; j++)
{
cout << setw(7) << array[j] << ' ';
}
cout << endl;
for ( int k = 0; k < Size; k++)
{
cout << array[k] << ' ';
for (int l = 0; l < Size; l++)
{
cout << setw(7) << a2d[k][l] << ' ';
}
cout << endl;
}
cout << endl;
for (int i = 0; i < Size; i++)
{
delete[] a2d[i];
}
delete[] a2d;
}
或者,使用模拟二维数组的一维数组,以便整个数组顺序分配在内存中,而不是分散在内存中:
void sumGrid(int array[],int& Size)
{
cout << "Sum Grid" << endl;
int *a2d = new int[Size*Size];
for (int i = 0; i < Size; i++)
{
for (int j = 0; j < Size; j++)
{
a2d[(i*Size)+j] = array[i] + array[j];
}
}
cout << " " << setw(7);
for (int j = 0; j < Size; j++)
{
cout << setw(7) << array[j] << ' ';
}
cout << endl;
for ( int k = 0; k < Size; k++)
{
cout << array[k] << ' ';
for (int l = 0; l < Size; l++)
{
cout << setw(7) << a2d[(k*Size)+l] << ' ';
}
cout << endl;
}
cout << endl;
delete[] a2d;
}
话虽如此,您应该避免直接使用 new[]
/delete[]
,因为它容易出错,而且在发生错误时尤其有可能导致内存泄漏。改用标准的 std::vector
容器,让它为您处理内存管理,例如:
使用二维稀疏数组:
#include <vector>
void sumGrid(int array[],int& Size)
{
cout << "Sum Grid" << endl;
std::vector<std::vector<int>> a2d(Size);
for (int i = 0; i < Size; i++)
{
a2d[i].resize(Size);
for (int j = 0; j < Size; j++)
{
a2d[i][j] = array[i] + array[j];
}
}
cout << " " << setw(7);
for (int j = 0; j < Size; j++)
{
cout << setw(7) << array[j] << ' ';
}
cout << endl;
for ( int k = 0; k < Size; k++)
{
cout << array[k] << ' ';
for (int l = 0; l < Size; l++)
{
cout << setw(7) << a2d[k][l] << ' ';
}
cout << endl;
}
cout << endl;
}
使用一维顺序数组:
#include <vector>
void sumGrid(int array[],int& Size)
{
cout << "Sum Grid" << endl;
std::vector<int> a2d(Size * Size);
for (int i = 0; i < Size; i++)
{
for (int j = 0; j < Size; j++)
{
a2d[(i*Size)+j] = array[i] + array[j];
}
}
cout << " " << setw(7);
for (int j = 0; j < Size; j++)
{
cout << setw(7) << array[j] << ' ';
}
cout << endl;
for ( int k = 0; k < Size; k++)
{
cout << array[k] << ' ';
for (int l = 0; l < Size; l++)
{
cout << setw(7) << a2d[(k*Size)+l] << ' ';
}
cout << endl;
}
cout << endl;
}