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();
}
Leave a Reply