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.
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
Prześlij komentarz