/ / Покажчик на 2 або 3-мірний суб-масив / суб-матриця - c ++, масиви, матриця

Покажчик до 2-х або 3-х мірних підречей / підматериалів - c + +, масиви, матриця

скажімо, у вас є матриця розмірів x per y (за z), визначена так:

int** tab = new int*[x];
for(int i=0; i<x; ++i) tab[i] = new int[y];

або

int*** tab = new int**[x];
for(int i=0; i<x; ++i) {
tab[i] = new int*[y];
for(int j=0; j<y; ++y) tab[i][j] = new int[z];
}

чи є розумний спосіб доступу до суб-матриці (get int**(*) без копіювання даних, звичайний C ++), який матиме верхній лівий кут [a, b (, c)] і розмір [A, B (, C)]?

Ось (краще чи гірше) графічні приклади проблеми.

приклад матриці 2d введіть опис зображення тут

Відповіді:

2 для відповіді № 1

Ви використовуєте так званий нерівний масив. Це масив масивів, де нічого, крім часу виконання, не дає змоги матрицям-підгрупам мати однаковий розмір. Звідси зубчасті, тому що ви могли б мати піддіарази різного розміру.

Для того, щоб мати субматрицю, яка також є aнерівномірний масив, необхідний для існування нерівного масиву покажчиків, що вказують на підполя субматриці. Вони взагалі не існують, так що ні, ви не можете зробити це "без копіювання" принаймні деяких масивів покажчиків на піддіапазони.

Якби ваша матриця була не зазубленою, а замість одного масиву крокувати, Тоді перегляди піддіапазонів можна було б створити без виділення нових масивів вказівника підмагнітника. Також було б більш дружним кешем.

Щоб записати матрицю без нерівності, почніть з написання масиву або класу span, який обробляє один вимір.

Для двох вимірів, ви збільшуєте клас інтервалу для зберігання кортежу розмірів розмірів або кроків. [] замість того, щоб повертати посилання на обчислений елемент, створюється примірник одновимірного нижнього інтервалу, який вказує на обчислене положення, до випадку виміру 0, де повертається посилання.

Це буде високоефективним, дозволятиме ефективні субаррей, але вимагає декількох десятків або 100 рядків коду, щоб отримати право.