Dynamic memory allocation konusu işlediğimize göre şimdi boyutları değişebilen bir array oluşturabiliriz.
#include <iostream>
using namespace std;
int* arr{};
int arr_size{};
int arr_capacity{};
// allocate more memory
void alloc_mem() {
if (arr) { // if arr not null
arr_capacity *= 2;
int* temp = new int[arr_capacity];
for (int i{}; i < arr_size; i++)
temp[i] = arr[i];
delete[] arr;
arr = temp;
return;
}
// if arr is null
arr_capacity = 8;
arr = new int[arr_capacity];
}
// deallocate memory
void dealloc_mem() {
if (arr_size == 0) {
delete[] arr;
arr = nullptr;
arr_capacity = 0;
return;
}
arr_capacity = arr_size + 8;
int* temp = new int[arr_capacity];
for (int i{}; i < arr_size; i++)
temp[i] = arr[i];
delete[] arr;
arr = temp;
}
// add the given number to the end of the arr
void push_back(int number) {
if (arr_size == arr_capacity)
alloc_mem();
arr[arr_size] = number;
arr_size++;
cout << "push_back(" << number << "); size: " << arr_size << " capacity: " << arr_capacity << "\n";
}
// delete last element from the arr
void pop_back() {
if (arr_size == 0)
return;
arr_size--;
if (arr_size == 0 || arr_size * 2 < arr_capacity)
dealloc_mem();
cout << "pop_back(); size: " << arr_size << " capacity: " << arr_capacity << "\n";
}
int main() {
for (int i = 0; i < 100; i++)
push_back(i);
for (int i = 0; i < 100; i++)
pop_back();
}
// push_back(0); size: 1 capacity : 8
// push_back(1); size: 2 capacity : 8
// ...
// push_back(6); size: 7 capacity : 8
// push_back(7); size: 8 capacity : 8
// push_back(8); size: 9 capacity : 16
// push_back(9); size: 10 capacity : 16
// ...
// push_back(14); size: 15 capacity : 16
// push_back(15); size: 16 capacity : 16
// push_back(16); size: 17 capacity : 32
// push_back(17); size: 18 capacity : 32
// ...
// push_back(30); size: 31 capacity : 32
// push_back(31); size: 32 capacity : 32
// push_back(32); size: 33 capacity : 64
// push_back(33); size: 34 capacity : 64
// ...
// push_back(62); size: 63 capacity : 64
// push_back(63); size: 64 capacity : 64
// push_back(64); size: 65 capacity : 128
// push_back(65); size: 66 capacity : 128
// ...
// push_back(98); size: 99 capacity : 128
// push_back(99); size: 100 capacity : 128
// pop_back(); size: 99 capacity : 128
// pop_back(); size: 98 capacity : 128
// ...
// pop_back(); size: 65 capacity : 128
// pop_back(); size: 64 capacity : 128
// pop_back(); size: 63 capacity : 71
// pop_back(); size: 62 capacity : 71
// ...
// pop_back(); size: 37 capacity : 71
// pop_back(); size: 36 capacity : 71
// pop_back(); size: 35 capacity : 43
// pop_back(); size: 34 capacity : 43
// ...
// pop_back(); size: 23 capacity : 43
// pop_back(); size: 22 capacity : 43
// pop_back(); size: 21 capacity : 29
// pop_back(); size: 20 capacity : 29
// ...
// pop_back(); size: 15 capacity : 29
// pop_back(); size: 14 capacity : 22
// pop_back(); size: 13 capacity : 22
// pop_back(); size: 12 capacity : 22
// pop_back(); size: 11 capacity : 22
// pop_back(); size: 10 capacity : 18
// pop_back(); size: 9 capacity : 18
// pop_back(); size: 8 capacity : 16
// pop_back(); size: 7 capacity : 15
// pop_back(); size: 6 capacity : 14
// pop_back(); size: 5 capacity : 13
// pop_back(); size: 4 capacity : 12
// pop_back(); size: 3 capacity : 11
// pop_back(); size: 2 capacity : 10
// pop_back(); size: 1 capacity : 9
// pop_back(); size: 0 capacity : 0Kendi kullanım amacınıza göre farklı şekillerde yazabilirsiniz. Kesin bir kuralı yok. Tabi bu tip temel şeyleri zamanın %99’unda biz yazmıyoruz. std::vector gibi hazır sınıfları kullanıyoruz. Fakat en azından daha derinlerde olayın nasıl gerçekleştiği hakkında bir fikir vereceğini umuyorum.

Leave a Reply