본문 바로가기
[C++] Data Structure & Algorithm/STL

[STL] vector #4

by song.ift 2023. 5. 15.

vector 직접 만들기

template<typename T> class Vector { ​​​​public: ​​​​​​​​Vector() ​​​​​​​​​​​​: _cata(nullptr), _size(0), _capacity(0) ​​​​​​​​{ ​​​​​​​​} ‌‌ ​​​​​​​​~Vector() ​​​​​​​​{ ​​​​​​​​​​​​if (_data) ​​​​​​​​​​​​​​​​delete[] _data; ​​​​​​​​} ​​​​​​​​T& operator[](const int pos) { return _data[pos]; } ​​​​public: ​​​​​​​​void push_back(const T& val) ​​​​​​​​{ if (_size == _capacity) { // 증설 작업 int newCapacity = static_cast<int>(_capacity * 1.5); // capacity가 0 or 1 이면 0과 1.5 짤려서 1을 반환하기 때문에 체크 if (newCapacity == _capacity) newCapacity++; reserve(newCapacity); } _data[_size] = val; } void reserve(int capacity) ​​​​​​​​{ _capacity = capacity; T* newData = new T[_capacity]; // 데이터 복사 for (int i = 0; i < _size; i++) newData[i] = _data[i]; // 기존에 있던 데이터 날린다. if (_data) delete[] _data; _data = newData; } int size() { return _size; } int capacity { return _capacity; } private: T* _data; int _size; int _capacity; }

 

iterator 추가

template<typename T> class Iterator { ​​​​public: ​​​​​​​​Iterator() ​​​​​​​​​​​​: _ptr(nullptr) ​​​​​​​​{ ​​​​​​​​} ​​​​​​​​Iterator(T* ptr) ​​​​​​​​​​​​: _ptr(ptr) ​​​​​​​​{ ​​​​​​​​} ​​​​​​​​Iterator& operator++() ​​​​​​​​{ ​​​​​​​​​​​​_ptr++; ​​​​​​​​​​​​return *this; ​​​​​​​​} ​​​​​​​​Iterator operator++(int) ​​​​​​​​{ ​​​​​​​​​​​​Iterator temp = *this; ​​​​​​​​​​​​_ptr++; ​​​​​​​​​​​​return temp; ​​​​​​​​} ​​​​​​​​Iterator operator+(const int count) ​​​​​​​​{ ​​​​​​​​​​​​Iterator temp = *this; ​​​​​​​​​​​​temp._ptr += count; ​​​​​​​​​​​​return temp; ​​​​​​​​} ​​​​​​​​bool operator==(const Iterator& right) ​​​​​​​​{ ​​​​​​​​​​​​return _ptr == right_ptr; ​​​​​​​​} ​​​​​​​​bool operator!=(const Iterator& right) ​​​​​​​​{ ​​​​​​​​​​​​return !(*this == right); ​​​​​​​​​​​​//return _ptr != right_ptr; ​​​​​​​​} ​​​​​​​​T& operator*() ​​​​​​​​{ ​​​​​​​​​​​​return *_ptr; ​​​​​​​​} ​​​​public: ​​​​​​​​T* _ptr; } template<typename T> class Vector { ​​​​public: ​​​​​​​​Vector() ​​​​​​​​​​​​: _cata(nullptr), _size(0), _capacity(0) ​​​​​​​​{ ​​​​​​​​} ‌‌ ​​​​​​​​~Vector() ​​​​​​​​{ ​​​​​​​​​​​​if (_data) ​​​​​​​​​​​​​​​​delete[] _data; ​​​​​​​​} ​​​​​​​​T& operator[](const int pos) { return _data[pos]; } ​​​​public: ​​​​​​​​void push_back(const T& val) ​​​​​​​​{ if (_size == _capacity) { // 증설 작업 int newCapacity = static_cast<int>(_capacity * 1.5); // capacity가 0 or 1 이면 0과 1.5 짤려서 1을 반환하기 때문에 체크 if (newCapacity == _capacity) newCapacity++; reserve(newCapacity); } _data[_size] = val; } void reserve(int capacity) ​​​​​​​​{ _capacity = capacity; T* newData = new T[_capacity]; // 데이터 복사 for (int i = 0; i < _size; i++) newData[i] = _data[i]; // 기존에 있던 데이터 날린다. if (_data) delete[] _data; _data = newData; } int size() { return _size; } int capacity { return _capacity; } public: typedef Iterator<T> iterator; iterator begin() { return iterator(&_data[0]); } iterator end() { return begin() + _size; } private: T* _data; int _size; int _capacity; }

 

'[C++] Data Structure & Algorithm > STL' 카테고리의 다른 글

[STL] list #2  (0) 2023.05.19
[STL] list #1  (0) 2023.05.15
[STL] vector #3  (0) 2023.05.15
[STL] vector #2  (0) 2023.05.15
[STL] vector #1  (0) 2023.05.15

댓글