먼저, vector은 bool타입에 대해 특수화되어있다.
하지만, vector은 bool타입이라고 하더라도 동일한 인터페이스를 보유해야 한다.
그러므로, 상속을 통해 멤버함수들을 순수 가상함수로 선언해주었다.
template<typename DataType>
class VectorBase
{
public:
class Iterator;
public:
virtual void Reserve(const size_t _Capacity) = 0;
virtual void Resize(const size_t _Size) = 0;
virtual void Resize(const size_t _Size, const DataType& _Data) = 0;
virtual void Resize(const size_t _Size, DataType&& _Data) = 0;
virtual void Push_Back(const DataType& _Data) = 0;
virtual void Push_Back(DataType&& _Data) = 0;
virtual void Pop_back() = 0;
virtual void Insert(const Iterator& _Where, const DataType& _Value) = 0;
virtual void Clear() = 0;
virtual const DataType& At(size_t _Index) = 0;
virtual const DataType& Front() = 0;
virtual const DataType& Back() = 0;
};
공통으로 구현해야 하는 함수들을 VectorBase라는 함수에 선언하였고, 이 클래스를 상속받도록 하였다.
또한, Iterator 클래스를 Vector이 아닌 VectorBase 내부로 이동시켜주었다.
이로 인해 템플릿 클래스의 중첩 클래스인 Iterator을 컴파일러가 혼동할 수 있으므로, Vector에는 아래의 구문을 추가해주었다.
using Iterator = typename VectorBase<DataType>::Iterator;
위의 구문으로 인해, 사용이 편해진 건 덤이다.
그리고 이를 기반으로, bool 타입을 제외한 Vector의 멤버함수에 몇 가지 함수를 추가로 구현해주었다.
const DataType& Front() override
{
return MyElements[0];
}
const DataType& Back() override
{
return MyElements[MySize - 1];
}
void Clear() override
{
MySize = 0;
EndPtr = BeginPtr + 1;
}
void Pop_back() override
{
if (MySize > 0)
{
MySize--;
EndPtr--;
}
}
void Insert(const Iterator& _Where, const DataType& _Value) override
{
if (MySize + 1 >= MyCapacity)
{
Reserve(MyCapacity * 2);
}
Iterator EndIter = End();
while (_Where != EndIter)
{
*EndIter = *(EndIter - 1);
}
}
이제, Vector<bool> 타입에 대해 함수를 모두 구현해주면 Vector는 일단은 마무리이다.
'프로젝트 > STL 자료구조 구현' 카테고리의 다른 글
STL 자료구조 구현 (7) - 예외 처리 구조 변경, List 일부 구현 (0) | 2024.09.10 |
---|---|
STL 자료구조 구현 (6) - 이터레이터 구조 변경 (0) | 2024.09.09 |
STL 자료구조 구현 (4) - 예외 처리 (3) | 2024.09.04 |
STL 자료구조 구현 (3) _ Vector::Iterator (0) | 2024.09.03 |
STL 자료구조 구현 (2) _ Vector<bool> 특수화 (0) | 2024.07.21 |