Default array’lerin bize sunduğu kullanışlılık gayet sınırlıdır. Bu sebeple default array’i kullanarak bize daha fazla seçenek ve kullanım kolaylığı sağlayan bir sınıf oluşturuyoruz.

C++ ‘da bu iş için std::vector ve std::array bulunmakta. Aşağı yukarı şu şekilde bir sınıf. Tabi isteğe bağlı olarak daha fazla fonksiyonellik eklenip çıkarılabilir. İsimler değişik olabilir.

Not: tüm fonksiyonları test etmedim.

#include <iostream>
#include <string> 
#include <cassert>

using namespace std; 

class MyArr{
public:
	MyArr();
	~MyArr();

	void display();// array'i terminale yazdırır
	int get_size();	// array'in boyutunu döner
	void append(int num); // sonuna yeni eleman ekler
	void insert(int index, int num); // indekse yeni eleman ekler
	void remove(int index); // indeksteki elemanı siler
	int search(int num); // verilen elemanın indexini döndürür

	int get(int index); // verilen indexteki elemanı döndürür 
	void set(int index, int num); // verilen indexteki elemana değer atar

	// maksimum ve minimum elemanları bulur
	int max();
	int min();

	void reverse(); // 123 -> 321; array'in elemanlarını tersine döndürür


private:
	int* arr{}; // array'in pointerı
	int size{}; // soyut olarak kapladığı alan. 
	int capacity{}; // bellekteki asıl kapladığı alan

	void expand(); // array'in kapasitesini iki katına çıkartır 
	void shrink(); // array'in kapasitesini yarıya indirir.
	void check_boundary(int index); // istenilen index'i kontrol eder
};


MyArr::MyArr(){
	arr = new int[32];
}

MyArr::~MyArr(){
	delete[] arr;
}

void MyArr::display(){
	for (int i{}; i < size; i++)
		cout << arr[i] << ", ";
	cout << endl;
}

int MyArr::get_size(){
	return size;
}


void MyArr::append(int num){
	if (size == capacity) expand();
	
	arr[size] = num; 
	size++;
	
}

void MyArr::insert(int index, int num) {
	check_boundary(index);
	if (size == capacity) expand();

	for (int i = size-1; i >= index; i--)
		arr[i + 1] = i;

	arr[index] = num;
	size++;
}

void MyArr::remove(int index){
	check_boundary(index);
	for (int i{ index }; i < size-1; i++)
		arr[i] = arr[i + 1];
		
	size--;
	
	if (size < capacity/2-1) shrink();
}

int MyArr::search(int num){
	for (int i{}; i < size; i++) 
		if (arr[i] == num) return i;	
	return -1; // eğer elemanı bulamazsa -1 döndürür. 
}
int MyArr::get(int index){
	check_boundary(index);
	return arr[index];
}
void MyArr::set(int index, int num){
	check_boundary(index);
	arr[index] = num;
}

int MyArr::max(){
	if (size == 0) assert("Zero length array");

	int x = arr[0];
	for (int i{}; i < size; i++)
		if (arr[i] > x) x = arr[i];

	return x;
}
int MyArr::min(){
	if (size == 0) assert("Zero length array");

	int x = arr[0];
	for (int i{}; i < size; i++)
		if (arr[i] < x) x = arr[i];

	return x;
}

void MyArr::reverse(){
	if (size == 0) assert("Zero length array");
	
	for (int i{}, j{size-1}; i < j; i++, j--)
		swap(arr[i], arr[j]);

}


void MyArr::expand(){
	// allocate memory for new array 
	int new_capacity = capacity * 2;
	int* new_arr = new int[new_capacity];

	// copy element from old array to new array 
	for (int i{}; i < capacity; i++) {
		new_arr[i] = arr[i];
	}
	
	delete[] arr; // delete old array
	arr = new_arr; // set new array as default 
	capacity = new_capacity; // set new capacity as default 
}

void MyArr::shrink(){
	// allocate memory for new array 
	int new_capacity = capacity / 2;
	int* new_arr = new int[new_capacity];

	// copy element from old array to new array 
	for (int i{}; i < new_capacity; i++) {
		new_arr[i] = arr[i];
	}

	delete[] arr; // delete old array
	arr = new_arr; // set new array as default 
	capacity = new_capacity; // set new capacity as default 
}

void MyArr::check_boundary(int index){
	if (index < 0 || index >= size) assert("invalid index");
}

int main() {
	MyArr arr;

	arr.display();

	arr.append(4);
	arr.append(3);
	arr.append(5);
	arr.append(8);
	arr.append(1);

	arr.display();
}

Comments

Leave a Reply

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