如何初始化int *const *const?
How to initialize int *const *const?
我需要一个固定宽度和高度的二维数组,它只能更改存储在其中的单个值。它在 header 中声明,随后在源文件中初始化。
我的发现让我尝试了以下片段;不幸的是,问题是关于 1d 或 non-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];
}
我希望在最后一个示例中,但是如果它们未初始化并且我无法初始化它们,我如何使用 c
的 "inner" 数组 因为它们是 const?
我不需要这个数组的不同类型吗?我在考虑 int d[][]
,但它的宽度和高度不固定。
在我看来这像是一个悖论(如果它存在于 c++ 世界中),我是否遗漏了什么?
I was thinking about int d[][]
but it doesn't have constant width and height.
int d[][]
没有意义(并且会被编译器拒绝)。对于多维数组,只有第一维的大小可以省略,表示类型不完整。其他维度的大小是类型的一部分。你不能省略它们,就像你不能省略 int
.
换句话说,如果你有int d[5][10]
这样的东西,那么你可以把它看成是元素类型int[10]
的一维数组。通常,将多维数组视为一维数组的特例。这将使一切更容易理解。
在 C++ 中解决您的问题的最佳方法是创建一个 class,其中包含私有 std::array<T, Width * Height> data;
和 int width
成员变量,并根据各个 x 和 y 参数计算数组偏移量在 public 成员函数中,例如:
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";
}
My hope was in the last example, but how can I use the "inner" arrays of c if they are not initialized and I am not able to initialize them since they are 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]
};
我需要一个固定宽度和高度的二维数组,它只能更改存储在其中的单个值。它在 header 中声明,随后在源文件中初始化。
我的发现让我尝试了以下片段;不幸的是,问题是关于 1d 或 non-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];
}
我希望在最后一个示例中,但是如果它们未初始化并且我无法初始化它们,我如何使用 c
的 "inner" 数组 因为它们是 const?
我不需要这个数组的不同类型吗?我在考虑 int d[][]
,但它的宽度和高度不固定。
在我看来这像是一个悖论(如果它存在于 c++ 世界中),我是否遗漏了什么?
I was thinking about
int d[][]
but it doesn't have constant width and height.
int d[][]
没有意义(并且会被编译器拒绝)。对于多维数组,只有第一维的大小可以省略,表示类型不完整。其他维度的大小是类型的一部分。你不能省略它们,就像你不能省略 int
.
换句话说,如果你有int d[5][10]
这样的东西,那么你可以把它看成是元素类型int[10]
的一维数组。通常,将多维数组视为一维数组的特例。这将使一切更容易理解。
在 C++ 中解决您的问题的最佳方法是创建一个 class,其中包含私有 std::array<T, Width * Height> data;
和 int width
成员变量,并根据各个 x 和 y 参数计算数组偏移量在 public 成员函数中,例如:
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";
}
My hope was in the last example, but how can I use the "inner" arrays of c if they are not initialized and I am not able to initialize them since they are 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]
};