Как инициализировать int * const * const?

Мне нужен 2d массив с фиксированной шириной и высотой, который может изменять только отдельные значения, хранящиеся в нем. Он объявляется в заголовке, а затем инициализируется в исходном файле.

То, что я нашел, заставило меня попробовать следующие фрагменты; к сожалению, вопросы касались либо 1d, либо неконстантных массивов и не соответствовали моей ситуации.

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 если они не инициализированы, и я не могу их инициализировать так как они постоянны?

Разве мне не нужен другой тип для этого массива? Я думал о int d[][] но он не имеет постоянной ширины и высоты.
Мне кажется это парадоксом (если он существует в мире с ++), я что-то упускаю?

2

Решение

Я думал о int d[][] но он не имеет постоянной ширины и высоты.

int d[][] не имеет смысла (и будет отклонено компилятором). Что касается многомерных массивов, то для обозначения неполного типа можно опустить только размер первого измерения. Размеры других размеров являются частью типа. Вы не можете опустить их, так же, как вы не можете опустить 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";
}
2

Другие решения

Моя надежда была в последнем примере, но как я могу использовать «внутренние» массивы c, если они не инициализированы и Я не могу их инициализировать, так как они?

Это не совсем так:

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]
};
1