CPP 039 – Arrays & Pointers

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 : 0

Kendi 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.


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *