Witam! Moje pytanie brzmi tak: jaki istnieje zwiazek miedzy typem deklarowanej zmiennej dynamicznej a iloscia alokowanej pamieci. i czy liczbę elementow tablicy dynamicznej mozna zmienic w trakcie dzialania programu.
Ilość pamięci zaalokowanej przez new zależy od tego jakiego typu ma być to zmienna(alokuje tyle ile musi - nie mniej, nie więcej).
Tak, można zmienić rozmiar, ale jest to kosztowne(może wymagać przekopiowania całej zawartości w nowe miejsce) - http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/
mozesz uzasadnic dlaczego?, przeczytalem zawartosc twojego linku, ale jestem poczatkujacy nie za bardzo rozumiem o co tam chodzi...
tzn dlaczego mozna zmienic rozmiar?
Program rezerwuje sobie miejsce w pamięci na tą tablicę. Następnie zaraz za nią dodaje sobie inne dane, np. inne zmienne. Jak chcesz powiększyć tablicę to nie może jej rozdzielić i zostawić pół w 1 miejscu pół w drugim, musi przepisać całą zawartość w nowe miejsce, a to zabiera sporo czasu, szczególnie jak jest dużo elementów.
.#Up/Down
Hmmm... chyba można sobie wywnioskować z tego co napisałem przed chwilą. Po prostu jest funkcja która na to pozwala. Jakby nie było mógłbyś stworzyć nową tabelę, większą o ile potrzebujesz i 'ręcznie' przepisywać wartości. Zresztą ta funkcja pewnie tak właśnie działa.
no tak ale jak uzasadnic to ze mozna zmienic rozmiar?
Ogólnie to zwiększenie tablicy dynamicznej polega na tym, że alokujesz nowe miejsce o większym rozmiarze niż poprzednio i kopiujesz do niego zawartość tablicy. Możesz spróbować algorytmu naiwnego, czyli przy dodaniu pojedynczego elementu tworzysz nową tablicę o wielkości o jeden większą. Jest to jednak wtedy bardzo wolne, bo kopiujesz n*(n-1)/2 razy pojedyncze elementy. W rzeczywistości rezerwuje się jakąś pamięć na elementy, i przy wykorzystaniu przez dodawane elementy tej rezerwy, jest ona zwiększana ileś razy, np. często dwukrotnie (nie pamiętam jak jest w rzeczywistych implementacjach np. std::vector). Przy zwiększaniu dwukrotnym po dodaniu n elementów do takiego pustego kontenera może się zrobić w sumie maksymalnie 3n kopii pojedynczych elementów, będziesz miał zaalokowane maksymalnie 2n pamięci i w danej chwili maksymalnie będziesz potrzebował 3n pamięci (obliczenie tego pozostawię jako zadanie dla czytelnika).
ok juz rozumiem, a jeszcze mam jedno pyanko (nie chce zakladac nowego tematu) dlaczego w tym programie jes tuzyte dwukrotne przypisanie do wskaznika wsk tablicy...przeciez niby i tak bedzie wskazywalo dopiero pozniej na pierwszy element:
int main()
{
char tab[40];
char *wsk;
int znaki = 0;
wsk = tab;
cout << "Podaj tekst:" << endl;
cin.getline(tab,40);
wsk = tab;
while (*wsk!='\0')
{
znaki++;
wsk++;
}
cout << "Wprowadziles " << znaki << " znakow";
getchar();
return 0;
}
Wystarczy jeden. Dowolny.