Czy jest możliwość utworzenia tablicy niesymetrycznej bez dynamicznej alokacji pamięci?
Co to jest tablica niesymetryczna?
Nieregularna w sensie że ma np 5 kolumn a każda kolumna inną liczbę wierszy.
Nie bardzo, ale zamiast new
i tak używaj wektor, choć w tym przypadku to efektywnie to samo.
A jeśli bym utworzył kilka tablic jednowymiarowych z różną ilością elementów i je wyświetlił to chyba będzie przypominać tablicę dwuwymiarową ?
Jeśli Cię to zadowala… Pilnowanie tego, ile masz tych tablic i jak długa jest każda z nich będzie jednak błędogenne w bardziej skomplikowanych programach.
Chyba mogę użyć jeszcze funkcji malloc.
Render125 napisał(a):
Chyba mogę użyć jeszcze funkcji malloc.
NIE
Dokładniejsze wytłumaczenie: możesz, ale nigdy nie powinieneś.
A, czyli lubisz życie na krawędzi…
(już new
i delete
to proszenie się o błędy, a malloc
i free
to już niemal ofiara całopalna w intencji tychże błędów…)
Z tablicami sprawa ma się w taki sposób, że musisz znać całkowity rozmiar z góry żeby je stworzyć na stosie, bez używania new. Innej drogi nie ma.
Zakładając, że wiesz ile te tablice razem do kupy zajmują możesz stworzyć jedną dużą, zawierającą w sobie pozostałe, a kwestie długości poszczególnych podtablic załatwić wskaźnikami i strukturą przechowującą adres i długość:
int containerArray[50];
struct Subarray
{
int *arrayBegin;
size_t size;
}
Subarray sub1;
sub1.arrayBegin = containerArray;
sub1.size = 5;
Subarray sub2;
sub2.arrayBegin = containterArray + sub1.size;
sub2.size = 15;
Subarray sub3;
sub3.arrayBegin = containerArray + sub1.size + sub2.size;
sub3.size = 30;
ale od razu mówię, że to strasznie kalekie rozwiązanie. Czemu nie możesz jak Swaróg przykazał posłużyć się wektorem, ewentualnie listą?
auto irregularMatrix = std::vector<std::vector<int>> {
{ 0 },
{ 1, 2 },
{ 6, 5, 9, 1, 2 },
{ 0 },
{ 1, 2 },
};
Radziłbym jednak dokładniej opisać twoje wymagania. Na razie rzuciłeś parę haseł i zgadujemy o co dokładnie ci chodzi.
No to zgadujemy dalej:
#include <iostream>
int main(){
const char * tab[5] = {
"Pierwszy napis",
"Drugi napis",
"Trzeci napis",
"Czwarty napis",
"Piaty napis"
};
for(int i = 0; i < 5; i++){
std::cout << tab[i] << std::endl;
}
return 0;
}
Render125 napisał(a):
Czy jest możliwość utworzenia tablicy niesymetrycznej bez dynamicznej alokacji pamięci?
Użyj wektorów -- będziesz miał co prawda dynamiczną alokację pamięci, ale ładnie schowaną.
std::vector<std::vector<int>> tab(5);
tab[0].resize(3);
tab[1].resize(31);
tab[2].resize(13);
tab[3].resize(7);
tab[4].resize(1);
tab[1][15] = -99;
tab[4][0] = 78;
// itd.