#ifndef __T_ARRAY_HPP___ #define __T_ARRAY_HPP___ #include template class Array { private: T* ptr; int cap; int len; public: Array(); Array(int size); Array(const Array& arr2); // copy constructor ~Array(); // destructor Array& operator=(const Array& arr2); T operator[] (int index) const; // getter T& operator[] (int index); // setter int capacity() const { return cap; } int length() const { return len; } void swap(Array& arr2); void resize(int new_size); }; template Array::Array() { len = 0; cap = 1000; ptr = new int[1000]; } template Array::Array(int size) { len = 0; cap = size; ptr = new T[cap]; } template Array::Array(const Array& arr2) { len = arr2.len; cap = arr2.cap; ptr = new T[cap]; for (int i = 0; i < len; i++) { ptr[i] = arr2.ptr[i]; } } template Array::~Array() { if (ptr != NULL) delete[] ptr; } template Array& Array::operator=(const Array& arr2) { if (ptr != NULL) delete[] ptr; ptr = NULL; len = arr2.len; cap = arr2.cap; ptr = new T[cap]; for (int i = 0; i < len; i++) { ptr[i] = arr2.ptr[i]; } return *this; } template T Array::operator[] (int index) const { // check boundary of index // ... return ptr[index]; } template T& Array::operator[] (int index) { // check boundary of index // ... return ptr[index]; } template void Array::resize(int new_size) { if (cap >= new_size) return; T* ptr2 = new T[new_size]; for (int i = 0; i < len; i++) { ptr2[i] = ptr[i]; } delete[] ptr; ptr = ptr2; // return; } template void Array::swap(Array& arr2) { T* tmp_ptr = ptr; ptr = arr2.ptr; arr2.ptr = tmp_ptr; int tmp = cap; cap = arr2.cap; arr2.cap = tmp; tmp = len; len = arr2.len; arr2.len = tmp; } #endif