Wskaźniki w C++ cz.2

Cześć!

Dzisiaj zajmiemy się drugą część wskaźników i związaną z Nią alokacją pamięci.

Wyobraźmy sobie, że mamy tablicę o rozmiarze 4. I chcielibyśmy mieć tablicę o rozmiarze 5. Co w pierwszej chwili przychodzi Nam do głowy ?

Alokacja na nowo. To nie jest jednak najlepszy pomysł, gdyż zobaczmy poniższy kod:

int *myTable = new int [4];
for(int i=0;i<4;i++)
myTable[i]=i;


for(int i=0;i<4;i++)

std::cout<<myTable[i]<<" ";

std::cout<<'\n';

myTable = new int [5];//Alokuje na nowo


for(int i=0;i<4;i++)

std::cout<<myTable[i]<<" ";

std::cout<<'\n';

Powyższy kod daje Nam jasno do zrozumienia, że spowoduje to utracenie danych w tablicy. Co więc powinniśmy zrobić?

Tutaj sprawa nie jest taka prosta. Możemy włożyć tablicę myTable to innej tablicy. I potem skopiować ją do tej pierwszej. Zobaczmy to w akcji:

int *myTable = new int [4];

int * secondTable = new int [4];

for(int i=0;i<4;i++)

myTable[i]=i;



for(int i=0;i<4;i++)

secondTable[i]=myTable[i];



for(int i=0;i<4;i++)

std::cout<<myTable[i]<<" ";

std::cout<<'\n';


myTable = new int [5];//Alokuje na nowo





for(int i=0;i<4;i++)

myTable[i]=secondTable[i];



 delete [] secondTable;



for(int i=0;i<4;i++)

std::cout<<myTable[i]<<" ";

std::cout<<'\n';



delete [] myTable;

Co robi powyższy kod ? Kopiuje tablice myTable do secondTable. Po czym po zaalokowaniu tablicy myTable do większej, przenosi do Niej to co było wcześniej, a my na samym końcu możemy teraz dopisać coś w stylu: myTable[4]=4;

To pierwszy sposób. Dużo lepszym sposobem, jeśli musimy ciągle dodawać i odejmować elementy, jest tzw. lista. Która pozwala na szybkie dodawanie i usuwanie elementów, bez ich tracenia. Oraz pozwala zrobić to szybciej, wygodniej i bezpieczniej niż tablice(gdyż u Niej elementy są porozrzucane luźno po pamięci, a nie składowane obok siebie, jak w tablicy, przez łatwiej zaoolokować np. 50 000kb po jednym kb, niż na raz 50 000kb. Dodatkowo jak widzimy, tablica na samym początku i tak będzie praktycznie nie używana. Oczywiście tylko przez moment, ale przez ten moment żrę pamięć na "nic"). Listami zajmiemy się jednak w osobnym materiale.

Komentarze

Popularne posty z tego bloga

Co dokładnie oznacza std::cout<<"Witaj Swiecie!"<<'\n''; w C++ ?

Klasy, Przestrzenie nazw, Nonlocal, Global i Local. Czy Python ma zmienne prywatne ?

Przeciążanie operatorów w C++