Я пытаюсь создать собственный класс таблицы с динамическими массивами и без использования векторов. Я это понимаю
T** values = new T* [rows];
создает массив указателей или указатель указателей. Я не уверен, как инициализировать новый массив для каждого указателя. Первоначально я думал, что это должно быть
for (int x = 0; x < rows; x++)
values[x] = new T [columns];
но это также выглядит неправильно, потому что я не использую никаких звездочек в этом коде. Поэтому я снова подумал об этом, и теперь я думаю, что мне, возможно, придется использовать новый указатель на итерацию через указатели в массиве. Я действительно не знаю код для этого. Я хочу сказать, что это
T* pointer;
for (pointer = values; pointer < values+rows; pointer++)
*pointer = new T [columns];
Я также не знаю, как установить значения внутри указанного массива. Я думаю * значения указывают на массив указателей, а ** указатели указывают на массив значений. Я не уверен, как указать, какой массив я хочу, но.. это будет просто что-то вроде ** values [0] [0] = T, чтобы установить значение внутри первого значения массива, на которое указывает первый указатель?
Как заявил Майк Сеймур в комментариях, ваша звездочка разыменования скрыта под operator[]
, а код
values[x] = new T [n];
эквивалентно
*(values + x) = new T [n];
Итак, чтобы получить доступ к элементу, вам больше не нужно разыгрывать:
**values[0][0] = T
но просто
values[0][0] = T
Рассмотрим также дизайн, где вам даже не нужен массив массивов, а только один массив:
T* values = new T [columns * rows];
То, что вы получите доступ просто путем вычисления индекса, что-то вроде:
values[y * rows + x]
Стоит сказать, что даже для учебных целей лучше использовать std::vector
. Если вы полностью настроены на собственные решения, напишите свой собственный класс динамических массивов (с использованием идиомы RAII). Класс таблицы с operator new
и необработанными указателями raw- operator new
либо будет небезопасным, либо подвержен утечкам, либо будет включать некоторые части динамического класса массивов здесь и там (дублирование кода и нарушение принципа единой ответственности).
Этот код
T** values = new T* [rows];
for (int x = 0; x < rows; x++)
values[x] = new T [columns];
действует
Если вы хотите использовать вторую запись, тогда код будет выглядеть так:
T** values = new T* [rows];
for ( T **ptr = values; ptr != values + rows; ++ptr )
*ptr = new T [columns];
values[0]
эквивалентны *values
Для инициализации значений вы должны использовать две циклы (хотя вы можете использовать только один цикл, но код будет менее читаемым)
for ( int i = 0; i < rows; i++ )
{
for ( int j = 0; j < columnds; j++ ) values[i][j] = SomeValue;
}
values[x]
, что эквивалентно*(values + x)
.T** values = new T* [rows * columns];
Работает для меня