STL - vector #4

이승덱·2021년 7월 21일

CPP

목록 보기
50/70
#include <iostream>

#include <vector>

using namespace std;

//오늘의 목표 : *야매*로 벡터 클래스를 만들어보자

template<typename T>

class Iterator {

public:

 Iterator() :_ptr(nullptr){

 }

 Iterator(T* ptr) :_ptr(ptr) {

 }

 Iterator operator+(const int count) {

 Iterator temp = *this;

 temp._ptr += count;

 return temp;

 }

 Iterator operator-(const int count) {

 Iterator temp = *this;

 temp._ptr -= count;

 return temp;

 }

 // ++it

 Iterator& operator++() {

 _ptr++;

 return *this;

 }

 // it++

 Iterator operator++(int) {

 Iterator temp = *this;

 _ptr++;

 return temp;

 }

 // --it

 Iterator& operator--() {

 _ptr--;

 return *this;

 }

 // it++

 Iterator operator--(int) {

 Iterator temp = *this;

 _ptr--;

 return temp;

 }

 bool operator==(const Iterator& right) {

 return _ptr == right._ptr;

 }

 bool operator!=(const Iterator& right) {

 return _ptr != right._ptr;

 }

 T& operator*() {

 return *_ptr;

 }

 ~Iterator() {

 }

public:

 T* _ptr;

};

template<typename T>

class Vector {

public:

 Vector() : _data(nullptr), _capacity(0), _size(0) {

 }

 ~Vector() {

 if (_data)

 delete[] _data;

 }

 // [              ]

 void push_back(const T& val) {

 if (_size == _capacity) {

 // 증설 작업

 int newCapacity = static_cast<int>(_capacity * 1.5f);

 if (newCapacity == _capacity)

 newCapacity++;

 reserve(newCapacity);

 }

 //데이터 저장

 _data[_size] = val;

 //데이터 개수 증가

 _size++;

 }

 //Ref로 하는 이유는 임의 접근을 통한 데이터 조작이 가능하게 하기 위해

 T& operator[](const int pos) { return _data[pos]; }

 //새 영역 할당

 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 this->begin() + _size; }

 void clear() { _size = 0; }

private:

 T* _data;

 int _size;

 int _capacity;

};

int main()

{

 Vector<int> v;

 v.reserve(100);

 for (int i = 0;i < 100;i++) {

 v.push_back(i);

 cout << v.size() << " " << v.capacity() << endl;

 }

 for (int i = 0;i < v.size();i++) {

 cout << v[i] << endl;

 }

 cout << "------------------------" << endl;

 for (Vector<int>::iterator it = v.begin();it != v.end();++it) {

 cout << (*it) << endl;

 }

 return 0;

}
profile
공부 기록용 블로그입니다

0개의 댓글