Forum Coders' city Strona Gwna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UytkownicyUytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj si, by sprawdzi wiadomociZaloguj si, by sprawdzi wiadomoci   ZalogujZaloguj 

Potrzebuj szybkiej odpowiedzi na moje pytanie... Zasady

[C++] Tworzenie tablicy dwuwymiarowej (komentarz)



 
Odpowiedz do tematu    Forum Coders' city Strona Gwna -> C i C++
Zobacz poprzedni temat :: Zobacz nastpny temat  
Autor Wiadomo
marcin_an



Doczy: 26 Maj 2005
Posty: 18822

PostWysany: Sro Kwi 15, 2009 2:14 pm  OP    Temat postu: [C++] Tworzenie tablicy dwuwymiarowej (komentarz) Odpowiedz z cytatem Pisownia

Post dotyczy tego posta w CUO.

W po?cie jest napisane, ?e przy korzystaniu z metody z alokacj? ci?g?ego obszaru pami?ci trudniej jest tworzy? tablice dwuwymiarowe o nietypowych kszta?tach. Wbrew pozorom w wi?kszo?ci przypadkw tak nie jest. Je?eli mamy kod alokuj?cy wiersze r?nej d?ugo?ci metod? alokacji ka?dego wiersza oddzielnie, to bez problemu zwykle mo?na to prze?o?y? bezpo?rednio na wersj? z pojedyncz? alokacj?. Schemat jest prosty. Rozmiar wymaganego obszaru ci?g?ego jest rwny sumie d?ugo?ci wszystkich wierszy. Oprcz tego musimy wiedzie?, gdzie zaczyna si? ka?dy z wierszy w zaalokowanym obszarze. Nietrudno si? domy?li?, ?e przesuni?cie jest sum? d?ugo?ci wszystkich poprzednich wierszy.

Dla osb lubi?cych wzorki:
Przy za?o?eniu, ?e jest n oraz s(i) oznacza rozmiar i-tego wiersza:
Rozmiar alokowanego obszaru

Przesuni?cie dla k-tego wiersza

Przek?adaj?c te wzorki bezpo?rednio na kod:
Kod:
static unsigned int const n = 9;
static unsigned int const s[n] = {1, 2, 3, 4, 5, 4, 3, 2, 1};
T* data = new T[accumulate(s, s + n, 0)];
vector<T*> rows(n);

for (unsigned int i = 0; i < n; ++i)
{
    rows[i] = data + accumulate(s, s + i, 0);
}
Oczywi?cie jest to niewydajne (linia 8: ci?g?e przeliczanie tego samego) i mo?na to zapisa? przynajmniej tak:
Kod:
static unsigned int const n = 9;
static unsigned int const s[n] = {1, 2, 3, 4, 5, 4, 3, 2, 1};
T* data = new T[accumulate(s, s + n, 0)];
vector<T*> rows(n);
unsigned int currentOffset = 0;

for (unsigned int i = 0; i < n; ++i)
{
    rows[i] = data + currentOffset;
    currentOffset += s[n]; // Zwi?kszamy przesuni?cie o rozmiar wiersza
}
W wi?kszo?ci przypadkw mo?na (nawet wypada) napisa? to optymalniej, zast?puj?c wyra?enie s[n] lub sum? s[n] innymi, prostszymi wyra?eniami. Np. dla tablicy prostok?tnej suma s[n] to po prostu iloczyn d?ugo?ci wiersza i indeksu aktualnego wiersza:
Kod:
rows[i] = data + i * rowLength; // Czyli to, co wszyscy znaj?
Dla tablicy trjk?tnej s[i] mo?na zast?pi? po prostu i. D?ugo?ci wierszy tworz? ci?g arytmetyczny, wi?c nietrudno rwnie? zauwa?y?, jak policzy? sum? d?ugo?ci wierszy. Itd.
_________________
Nieaktywny od 2017-04-01
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
Wywietl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Gwna -> C i C++ Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Moesz pisa nowe tematy
Moesz odpowiada w tematach
Nie moesz zmienia swoich postw
Nie moesz usuwa swoich postw
Nie moesz gosowa w ankietach
Moesz dodawa zaczniki na tym forum
Moesz pobiera pliki z tego forum




Debug: strone wygenerowano w 0.21091 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |