Notice
Recent Posts
Recent Comments
Link
오븐 노트
[C++] vector #4 본문
vector와 iterator의 일부 기능 구현
#include <iostream>
using namespace std;
#include <vector>
template<typename T>
class Iterator
{
public:
Iterator() : _ptr(nullptr)
{
}
Iterator(T* ptr) : _ptr(ptr)
{
}
Iterator& operator++() // 자기 자신의 참조를 뱉어주는 전위형
{
_ptr++;
return *this;
//int a = 1;
//int b = ++(++a); // 자기 자신의 참조를 뱉어주는 형태
}
Iterator operator++(int) // 복사된 값을 뱉어주는 후위형
{
Iterator temp = *this;
_ptr++;
return temp;
//int a = 1;
//int b = (a++); // 복사된 값을 뱉어주는 형태
}
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;
}
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); // 상단의 == 오퍼레이터를 호출하여 판단시킬 수 있음
}
T& operator*() // 역참조 문법 지원 기능
{
return *_ptr; // 해당 값의 참조값을 따와서 T&(레퍼런스) 형태로 반환
}
public:
T* _ptr; // Iterator는 포인터를 래핑하는 클래스
};
template<typename T>
class Vector
{
public:
Vector() : _data(nullptr), _size(0), _capacity(0)
{
}
~Vector()
{
if (_data)
delete[] _data;
}
void push_back(const T& val)
{
if (_size == _capacity)
{
// 증설 작업
int newCapacity = static_cast<int>(_capacity * 1.5);
if (newCapacity == _capacity)
newCapacity++;
reserve(newCapacity);
}
// 데이터 저장
_data[_size] = val;
// 데이터 개수 증가
_size++;
}
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;
}
T& operator[](const int pos) { return _data[pos]; }
int size() { return _size; }
int capacity() { return _capacity; }
public:
typedef Iterator<T> iterator;
void clear() { _size = 0; }
iterator begin() { return iterator(&_data[0]); }
iterator end() { return begin() + _size; }
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;
}
v.clear();
return 0;
}
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.
모든 글은 제가 공부하기 위해 작성합니다.
'Develop > C++' 카테고리의 다른 글
[C++] list #2 (0) | 2023.06.09 |
---|---|
[C++] list #1 (0) | 2023.06.08 |
[C++] vector #3 (0) | 2023.05.29 |
[C++] vector #2 (0) | 2023.05.29 |
[C++] vector #1 (0) | 2023.05.18 |