W C++, a nawet w C jest możliwa tablica dwuwymiarowa na stosie, ale jej wielkość musi być stała i określona w chwili kompilacji.
int StackArray[10][10];
Czy taki twór tak naprawdę tworzy tablicę 100-elementową, a wszystkie odniesienia są odpowiednio przeliczane?
Natomiast jak szukałem w internecie, jak zrobić tablicą dwuwymiarową na stercie, to co znalazłem opis takiej tablicy, to tak naprawdę znalazłem opis tworzenia jednowymiarowej tablicy wskaźników, która odnosi się do tablic jednowymiarowych. Teoretycznie, da się zrobić klasę obsługującą tablicę dwuwymiarową. Piszę na szybko, bez testowania, więc mogą być błędy:
#include <vector>
class ArrayInt2dim
{
public:
ArrayInt2dim(int W_, int H_)
{
W = W_;
H = H_;
Data.reserve(W * H);
}
void Set(int X, int Y, int Val)
{
Data[Y * H_ + X] = Val;
}
int Get(int X, int Y)
{
return Data[Y * H_ + X];
}
private:
std::vector<int> Data;
int W;
int H;
}
To co wyżej napisałem, to jest możliwie najprościej, oczywiście warto napisać szablon dla dowolnego typu, przeciążyć operator []
, zaimplementować zmianę rozmiaru z zachowaniem zawartości i wiele więcej.
Pytanie brzmi: Jaki typ ze standardowej biblioteki C++20 tworzy tablice dwuwymiarowe (ogólnie, wielowymiarowe), która funkcjonowałaby tak samo, jak dwuwymiarowa na stosie lub jednowymiarowa z przeliczaniem współrzednych?
Chodzi o coś takiego, tyle, że zamiast ArrayInt2dim<int>
byłaby nazwa typu ze standardowej biblioteki;
int main()
{
// Tablica 10x10 na stosie
int StackArray[10][10];
// Deklaracja tablicy na stercie
ArrayInt2dim<int> * HeapArray = NULL;
// Tworzenie tablicy 10x10 na stercie w trakcie pracy programu
HeapArray = new ArrayInt2dim<int>(10, 10);
// Użytkowanie obu tablic w identyczny sposób
int SomeVal1, SomeVal2, SomeVal3, SomeVal4;
for (int Y = 0; Y < 10; Y++)
{
for (int X = 0; X < 10; X++)
{
// Odczyt elementów do zmiennych
SomeVal1 = StackArray[X][Y];
SomeVal2 = HeapArray[X][Y];
// Zapis elementów z zmiennych lub funkcji
StackArray[X][Y] = SomeVal3;
HeapArray[X][Y] = SomeVal4;
}
}
// Niszczenie tablicy na stercie w trakcie pracy programu
delete HeapArray;
}
To też tak napisane najprościej, jak można, żeby było widoczne, o co pytam. Normalnie, to zamiast zwykłego wskaźnika lepiej użyć unique_ptr
lub shared_ptr
.