Skip to content

Instantly share code, notes, and snippets.

@justiceHui
Created January 27, 2024 15:15
Show Gist options
  • Save justiceHui/34bbc1ed9a31f0d2902edd86571f6e80 to your computer and use it in GitHub Desktop.
Save justiceHui/34bbc1ed9a31f0d2902edd86571f6e80 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <algorithm>
using namespace std;
template<typename T>
class dynamic_array{
private:
T *arr;
size_t sz, cap;
void set_capacity(size_t new_cap){
T *new_arr = new T[new_cap];
for(int i=0; i<min(sz, new_cap); i++) new_arr[i] = arr[i];
delete[] arr;
arr = new_arr;
cap = new_cap;
}
public:
dynamic_array(){
sz = 0;
set_capacity(0);
}
void push_back(const T x){
if(sz == cap) set_capacity(cap == 0 ? 1 : cap * 2);
arr[sz++] = x;
}
void pop_back(){
sz--;
if(sz == 0 || sz * 4 <= cap) set_capacity(cap / 2);
}
void resize(size_t new_sz){
if(new_sz > sz){
if(new_sz > cap) set_capacity(max(new_sz, cap*2));
while(sz < new_sz) arr[sz++] = T();
}
else if(new_sz < sz){
if(new_sz * 4 <= cap) set_capacity(min(new_sz*2, cap/2));
sz = new_sz;
}
}
size_t size() const { return sz; }
size_t capacity() const { return cap; }
T& operator [] (const size_t index) { return arr[index]; }
const T& operator [] (const size_t index) const { return arr[index]; }
T& front() { return arr[0]; }
const T& front() const { return arr[0]; }
T& back() { return arr[sz-1]; }
const T& back() const { return arr[sz-1]; }
T* begin() { return arr; }
const T* begin() const { return arr; }
T* end() { return arr + sz; }
const T* end() const { return arr + sz; }
};
template<typename T>
void print_array(const dynamic_array<T> &v){
for(auto i : v) cout << i << " ";
cout << "\n";
}
void vectorTest(){
dynamic_array<int> vec;
for(int i=0; i<10; i++) vec.push_back(i);
cout << "size / capacity : " << vec.size() << " / " << vec.capacity() << "\n";
cout << "front / back : " << vec.front() << " / " << vec.back() << "\n";
vec.pop_back();
cout << "back(after pop_back) : " << vec.back() << "\n";
vec.resize(5);
cout << "resize(5) : ";
print_array(vec);
vec.resize(25);
cout << "resize(25) : ";
print_array(vec);
for(int i=0; i<20; i++) vec.pop_back();
cout << "size / capacity(after pop_back*20) : " << vec.size() << " " << vec.capacity() << "\n";
vec[0] = 10; vec[1] = 5; vec[2] = 9; vec[3] = 1; vec[4] = 7;
cout << "before sort : ";
print_array(vec);
sort(vec.begin(), vec.end());
cout << "after sort : ";
print_array(vec);
}
int main(){
vectorTest();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment