/ / Wskaźnik do 2 lub 3-wymiarowej pod-macierzy / pod-macierzy - c ++, tablice, macierz

Wskaźnik do 2 lub 3-wymiarowej pod-macierzy / pod-macierzy - c ++, tablice, macierz

powiedzmy, że macie macierz wymiarów x na y (na z) zdefiniowanych jak:

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

lub

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

czy istnieje jakiś inteligentny sposób dostępu do pod-macierzy (get int**(*) bez kopiowania danych, zwykły C ++), który będzie miał lewy górny (przedni) narożnik [a, b (, c)] i rozmiar [A, B (, C)]?

Oto graficzne przykłady problemu.

macierz 2d przykład wprowadź opis obrazu tutaj

Odpowiedzi:

2 dla odpowiedzi № 1

Używasz czegoś, co nazywa się poszarpaną tablicą. Jest to tablica tablic, w której nic poza środowiskiem wykonawczym nie wymusza, aby podrzędne macierze były tej samej wielkości. Stąd postrzępione, ponieważ możesz mieć podmary różnią się rozmiarem.

Aby mieć submatrix, która również jestposzarpana tablica, potrzebujesz tam, by istniała poszarpana tablica wskaźników wskazujących na podmacie submatrix. Nie istnieją one ogólnie, więc nie, nie można tego zrobić "bez kopiowania" przynajmniej niektórych tablic wskaźników do podrysów.

Gdyby twoja macierz nie była zbudowana z poszarpanej tablicy, a zamiast niej pojedyncza tablica z krok, a następnie widoki podstrumieni mogą być tworzone bez przydzielania nowych tablic wskaźników podrzędnych. Również byłoby bardziej przyjazne dla pamięci podręcznej.

Aby zapisać macierz nieregularną, zacznij od napisania widoku tablicy lub klasy zakresu, który obsługuje jeden wymiar.

W przypadku dwóch wymiarów powiększasz klasę zakresu, aby przechowywać krotkę rozmiarów lub kroków. [] zamiast zwracania odwołania do obliczonego elementu tworzy instancję o jednym wymiarze i niższym zakresie, wskazującą pozycję obliczoną, aż do wymiaru 0, w którym zwracane jest odwołanie.

Będzie to wysoce wydajne, wydajne pod-mapy, ale do uzyskania prawidłowego wyniku potrzeba kilkudziesięciu lub nawet 100 linii kodu.