11 분 소요

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. 제공 함수

  1. reserve
    • 벡터의 capacity를 설정해 주는 함수 (매개변수가 현재 capacity 이하면 동작 하지 않음)
    • 현재 capacity를 변경하고 새로운 메모리를 할당받아 원소를 복사한다.
      public:
       void reserve(int capacity)
         {
             if (capacity <= _capacity)
                 return;
      
             SetCapacity(capacity);		
         }
      
  2. 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;
       }
      
  3. pop_back
    • 벡터의 맨 마지막 원소를 삭제해 주는 함수
      public:
       void pop_back()
         {
             --_size;	// 원소의 개수만 줄여준다.
         }
      
  4. clear
    • 모든 원소를 삭제해 주는 함수
    • capacity 만큼 공간 유지
      public:
       void clear()
         {
             if (_data)
             {
                 delete[] _data;
                 _data = new T[_capacity];	// allocator c++ 알아보기
             }
      
             _size = 0;
         }
      
  5. shrink_to_fit
    • size에 맞게 capacity를 수정해 주는 함수
      public:
       void shrink_to_fit()
         {
             SetCapacity(_size);
         }
      
  6. []
    • Random Access를 가능하게 해주는 연산자
      public:
       T& operator[](const int pos) { return _data[pos]; }
      
  7. front, back
    • 맨 앞, 맨 뒤 원소를 반환하는 함수
      public:
       T& front() { return _data[0]; } // 맨 앞 원소
       T& back() { return _data[_size - 1]; } // 맨 뒤 원소
      
  8. empty
    • 원소가 없는 상태인지 판별해 주는 함수
      public:
       bool empty() { return _size == 0; }
      
  9. 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;
	}

카테고리:

업데이트:

댓글남기기