vector 직접 만들어 보기
1. 템플릿 클래스 생성하기
#include <iostream>
using namespace std ;
template < typename T >
class my_vector
{
// TODO
};
2. 가지고 있는 데이터 설정
private:
T * _data = nullptr ; // 데이터를 저장하고 있는 배열의 시작 주소
int _size = 0 ; // 원소의 개수
int _capacity = 0 ; // 벡터의 용량
3. 생성자 및 소멸자
public:
my_vector ()
{
}
~ my_vector ()
{
if ( _data )
delete [] _data ; // 데이터가 존재하면 메모리를 해제한다.
}
4. 제공 함수
reserve
벡터의 capacity를 설정해 주는 함수 (매개변수가 현재 capacity 이하면 동작 하지 않음)
현재 capacity를 변경하고 새로운 메모리를 할당받아 원소를 복사한다.
public:
void reserve ( int capacity )
{
if ( capacity <= _capacity )
return ;
SetCapacity ( capacity );
}
push_back
벡터의 맨 마지막에 원소를 추가해 주는 함수
capacity와 size의 값이 같다면 capacity를 1.5배 증가 시킨다.
public:
void push_back ( const T & value )
{
if ( _size == _capacity )
{
int newCapacity = static_cast < int > ( _capacity * 1.5 );
if ( _size == newCapacity )
++ newCapacity ;
reserve ( newCapacity );
}
_data [ _size ++ ] = value ;
}
pop_back
벡터의 맨 마지막 원소를 삭제해 주는 함수
public:
void pop_back ()
{
-- _size ; // 원소의 개수만 줄여준다.
}
clear
모든 원소를 삭제해 주는 함수
capacity 만큼 공간 유지
public:
void clear ()
{
if ( _data )
{
delete [] _data ;
_data = new T [ _capacity ]; // allocator c++ 알아보기
}
_size = 0 ;
}
shrink_to_fit
size에 맞게 capacity를 수정해 주는 함수
public:
void shrink_to_fit ()
{
SetCapacity ( _size );
}
[]
Random Access를 가능하게 해주는 연산자
public:
T & operator []( const int pos ) { return _data [ pos ]; }
front
, back
맨 앞, 맨 뒤 원소를 반환하는 함수
public:
T & front () { return _data [ 0 ]; } // 맨 앞 원소
T & back () { return _data [ _size - 1 ]; } // 맨 뒤 원소
empty
원소가 없는 상태인지 판별해 주는 함수
public:
bool empty () { return _size == 0 ; }
capacity
, size
벡터의 용량과 원소의 개수를 반환하는 함수
public:
int size () { return _size ; }
int capacity () { return _capacity ; }
5. capacity 변경 함수
private:
void SetCapacity ( 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 ;
}
카테고리:
cpp
업데이트: September 18, 2022
댓글남기기