我需要一个固定宽度和高度的二维数组,只能更改存储在其中的各个值。它在标头中声明,稍后在源文件中初始化。
我发现的东西让我尝试以下片段;不幸的是,问题是关于1d或非const阵列,并且与我的情况不符。
int *const *const a = new int[10][10];
int *const *const b = new int[10][10]();
int *const *const c = new int*[10];
for (int i = 0; i < 10; ++i) {
c[i] = new int[10];
}
我的希望是在最后一个例子中,但我怎样才能使用&#34;内部&#34; c
的数组如果它们未初始化且我无法初始化它们因为它们是const?
这个阵列我不需要不同的类型吗?我在考虑int d[][]
,但它没有恒定的宽度和高度
在我看来,这似乎是一个悖论(如果它存在于c ++世界中),我错过了什么吗?
答案 0 :(得分:2)
我在考虑
int d[][]
,但它没有恒定的宽度和高度。
int d[][]
没有意义(并且将被编译器拒绝)。就多维数组而言,只能省略第一维的大小来表示不完整的类型。其他方面&#39;尺寸是该类型的一部分。你不能省略它们,就像你不能省略int
。
换句话说,如果您有类似int d[5][10]
的内容,那么您可以将其视为元素类型int[10]
的一维数组。通常,将多维数组视为一维数组的特殊情况。这将使一切变得更容易理解。
在C ++中解决问题的最佳方法是创建一个内部包含私有std::array<T, Width * Height> data;
和int width
成员变量的类,并从公共成员函数中的各个x和y参数计算数组偏移量,例如:
T& operator()(int x, int y)
{
return data[y * width + x];
}
如果仅在运行时知道维度,那么您唯一需要更改的是使用std::vector
而不是std::array
。存储仍然是连续的。
这是一个完整的例子:
#include <vector>
#include <iostream>
class Matrix
{
public:
Matrix(int width, int height, int value) :
width(width),
data(width * height, value)
{}
int& operator()(int x, int y)
{
return data[y * width + x];
}
private:
int width;
std::vector<int> data;
};
int main()
{
Matrix m(5, 10, 123);
std::cout << m(7, 8) << "\n";
m(7, 8) = 124;
std::cout << m(7, 8) << "\n";
}
答案 1 :(得分:1)
我的希望是在最后一个例子中,但是如果它们没有初始化我怎么能使用c的“内部”数组呢?我不能初始化它们因为它们是const ?
这根本不是真的:
int * const * const c = new int*[10]
{
new int[10], new int[10], new int[10], new int[10], new int[10],
new int[10], new int[10], new int[10], new int[10], new int[10]
};