Создание массива указателей на массивы класса T

0

Я пытаюсь создать собственный класс таблицы с динамическими массивами и без использования векторов. Я это понимаю

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

  • 3
    «Я не использую звездочки в этом коде» - есть одна скрытая в values[x] , что эквивалентно *(values + x) .
  • 0
    T** values = new T* [rows * columns]; Работает для меня
Показать ещё 4 комментария
Теги:
arrays
multidimensional-array
pointers
dynamic

2 ответа

1
Лучший ответ

Как заявил Майк Сеймур в комментариях, ваша звездочка разыменования скрыта под 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 либо будет небезопасным, либо подвержен утечкам, либо будет включать некоторые части динамического класса массивов здесь и там (дублирование кода и нарушение принципа единой ответственности).

  • 0
    @ Jarod42, Анатолиг Спасибо! Исправлена. Это было слишком быстрое копирование-вставка;)
0

Этот код

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню