STL 구현 작성일 2018-10-01 | In Unifox vector 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116#pragma once #include <string> namespace JH{ typedef unsigned int size_t; template <typename T> class vector{ private: T *arr; size_t ncapacity, nsize; void realloc(size_t); //O(n) public: //constructor vector(); //O(1) vector(size_t); //O(n) vector(size_t size, T value); //O(n) //destructor ~vector(){ delete[] arr; } //O(1) //element eccess T at(size_t); //O(1) T operator [] (size_t); //O(1) T front(){ return at(0); } //O(1) T back(){ return at(nsize-1); } //O(1) //iterators T* begin(){ return arr; } //O(1) T* end(){ return arr+nsize(); } //O(1) //capacity bool empty(){ return (nsize==0); } //O(1) size_t size(){ return nsize; } //O(n) size_t capacity(){ return ncapacity; } //O(1) //modifiers void clear(); //O(1) void push_back(T); //amortized O(1) void pop_back(); //amortized O(1) void resize(size_t); //O(n) std::string iterType(); }; template <typename T> vector<T>::vector(){ arr = nullptr; ncapacity = nsize = 0; } template <typename T> vector<T>::vector(size_t size){ ncapacity = nsize = size; arr = new T[size]; for(int i=0; i<size; i++) arr[i] = 0; } template <typename T> vector<T>::vector(size_t size, T value){ ncapacity = nsize = size; arr = new T[size]; for(int i=0; i<size; i++) arr[i] = value; } template <typename T> void vector<T>::realloc(size_t newSize){ T *tmp = arr; arr = new T[newSize]; for(int i=0; i<nsize && i<newSize; i++){ arr[i] = tmp[i]; } if(tmp) delete[] tmp; ncapacity = newSize; } template <typename T> T vector<T>::at(size_t idx){ if(idx < nsize) return arr[idx]; else return 0; } template <typename T> T vector<T>::operator [] (size_t idx){ return at(idx); } template <typename T> void vector<T>::clear(){ nsize = 0; realloc(0); } template <typename T> void vector<T>::push_back(T value){ if(nsize == ncapacity){ int newSize; if(!nsize) newSize = 16; else newSize *= 2; realloc(newSize); } arr[nsize++] = value; } template <typename T> void vector<T>::pop_back(){ if(nsize == 0) return; nsize--; if(nsize < ncapacity/2){ realloc(ncapacity/2); } } template <typename T> void vector<T>::resize(size_t size){ realloc(size); } template <typename T> std::string vector<T>::iterType(){ return "random access"; } } linked List 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152#pragma once #include <iostream> #include <string> namespace JH{ template <typename T> class node{ public: T data; node<T>* prv; node<T>* nxt; node(){ data = 0, prv = nxt = nullptr; } node(T value){ data = value, prv = nxt = nullptr; } }; template <typename T> class list{ private: node<T> *nbegin; node<T> *nend; size_t nsize; public: //constructor list(){ nbegin = new node<T>(); nend = new node<T>(); nbegin->nxt = nend; nend->prv = nbegin; nsize = 0; } //O(1) //destructor ~list(); //O(n) //iterators node<T>* begin(){ return nbegin->nxt; } //O(1) node<T>* end(){ return nend; } //O(1) //capacity size_t size(){ return nsize; } //O(1) bool empty(){ return (nsize == 0); } //O(1) //element access T front(){ return nbegin->nxt->data; } //O(1) T back(){ return nend->prv->data; } //O(1) //modifiers void insert(node<T>*, T); //O(1) void insert(int, T); //O(n) void erase(node<T>*); //O(1) void erase(int); //O(n) void push_back(T); //O(1) void pop_back(); //O(1) void push_front(T); //O(1) void pop_front(); //O(1) void print(); //O(n) std::string iterType(); }; template <typename T> void list<T>::insert(node<T>* prv, T value){ if(prv == nend){ std::cout << "reject" << std::endl; return; } if(prv == nullptr){ std::cout << "NullPointerException" << std::endl; return; } nsize++; node<T> *ptr = new node<T>(value); ptr->prv = prv; ptr->nxt = prv->nxt; prv->nxt->prv = ptr; prv->nxt = ptr; } template <typename T> void list<T>::insert(int pos, T value){ node<T> *iter = nbegin; for(int i=0; i<pos; i++){ iter = iter->nxt; } insert(iter, value); } template <typename T> void list<T>::erase(node<T>* ptr){ if(ptr == nbegin){ std::cout << "reject" << std::endl; return; } if(ptr == nullptr){ std::cout << "NullPointerException" << std::endl; return; } nsize--; ptr->prv->nxt = ptr->nxt; ptr->nxt->prv = ptr->prv; delete ptr; } template <typename T> void list<T>::erase(int pos){ node<T> *iter = nbegin; for(int i=0; i<=pos; i++){ iter = iter->nxt; } erase(iter); } template <typename T> void list<T>::push_back(T value){ insert(nend->prv, value); } template <typename T> void list<T>::pop_back(){ erase(nend->prv); } template <typename T> void list<T>::push_front(T value){ insert(nbegin, value); } template <typename T> void list<T>::pop_front(){ erase(nbegin->nxt); } template <typename T> list<T>::~list(){ auto now = nbegin; auto nxt = nbegin->nxt; while(now != nend){ if(now) delete now; now = nxt; if(now != nend) nxt = now->nxt; } } template <typename T> void list<T>::print(){ auto iter = begin(); for(; iter != end(); iter = iter->nxt) std::cout << iter->data << std::ends; } template <typename T> std::string list<T>::iterType(){ return "bidirectional"; } } stack 123456789101112131415161718192021222324252627282930#include "vector.h" #include "list.h" #pragma once namespace JH{ template <typename T> class stack{ private: vector<T> arr; public: bool empty(){ return arr.empty(); } //O(1) size_t size(){ return arr.size(); } //O(1) T top(){ return arr.back(); } //O(1) void push(T value){ arr.push_back(value); } //amortized O(1) void pop(){ arr.pop_back(); } //amortized O(1) }; template <typename T> class stack_list{ private: list<T> arr; public: bool empty(){ return arr.empty(); } //O(1) size_t size(){ return arr.size(); } //O(1) T top(){ return arr.back(); } //O(1) void push(T value){ arr.push_back(value); } //amortized O(1) void pop(){ arr.pop_back(); } //amortized O(1) }; } queue 1234567891011121314151617#pragma once #include "list.h" namespace JH{ template <typename T> class queue{ private: list<T> arr; public: bool empty(){ return arr.empty(); } //O(1) size_t size(){ return arr.size(); } //O(1) T back(){ return arr.back(); } //O(1) T front(){ return arr.front(); } //O(1) void push(T value){ arr.push_back(value); } //amortized O(1) void pop(){ arr.pop_front(); } //amortized O(1) }; }