std::vector가 대표적인 동적 배열Vector 클래스template<typename T>
class Vector
{
public:
Vector() {}
~Vector()
{
if (_data)
delete[] _data;
}
void push_back(const T& value)
{
if (_size == _capacity)
{
int newCapacity = static_cast<int>(_capacity * 1.5);
if (newCapacity == _capacity) // 0일 경우 방지
newCapacity++;
reserve(newCapacity);
}
_data[_size] = value;
_size++;
}
void reserve(int capacity)
{
if (_capacity >= capacity)
return;
_capacity = capacity;
T* newData = new T[_capacity];
for (int i = 0; i < _size; i++)
newData[i] = _data[i];
if (_data)
delete[] _data;
_data = newData;
}
void clear()
{
if (_data)
{
delete[] _data;
_data = new T[_capacity]; // capacity는 유지
}
_size = 0;
}
T& operator[](const int index) { return _data[index]; }
int size() { return _size; }
int capacity() { return _capacity; }
private:
T* _data = nullptr;
int _size = 0;
int _capacity = 0;
};
push_back(const T& value)새로운 요소를 배열 끝에 추가합니다.
_size == _capacity면 → 증설 필요_capacity * 1.5 방식으로 증가 (STL과 유사한 방식)reserve(int capacity)새로운 공간을 확보하며, 기존 데이터를 복사합니다.
clear()데이터를 모두 지우되 capacity는 유지
_size는 0으로 리셋operator[]배열처럼 요소 접근 가능
vector[3]과 같이 사용 가능size() vs capacity()size: 현재 담긴 요소의 개수capacity: 할당된 전체 공간 (여유분 포함)int main()
{
Vector<int> v;
for (int i = 0; i < 100; i++)
{
v.push_back(i);
cout << v[i] << " " << v.size() << " " << v.capacity() << endl;
}
v.clear();
cout << "After clear: " << v.size() << " " << v.capacity() << endl;
}
Vector<int> 객체 생성push_back 100회 반복size, capacity 출력capacity가 점프식 증가clear() 호출size == 0)capacity는 유지됨reserve() vs resize() 차이| 함수명 | 목적 | 크기 변화 | capacity 변화 | 초기화 |
|---|---|---|---|---|
reserve(n) | 공간 확보 | ❌ size 그대로 | ✅ 증가 가능 | ❌ |
resize(n) | 크기 조절 | ✅ 바뀜 | ✅ 또는 유지 | ✅ default 값으로 초기화됨 |
reserve: "미리 방만 만들어둠"
resize: "방을 만들고 사람도 넣음"