벡터의 이터레이터를 구현하였다.
처음엔, IteratorBase를 구현하고 이를 모든 자료구조의 Iterator이 상속받도록 하여 Algorithm 함수가 다양한 Iterator에 대해 대응하도록 하고 싶었고, 또 순수가상함수를 이용해 이터레이터간의 공통적인 인터페이스를 구현하고 싶었다.
하지만, 공변의 문제로 가상함수화 하기 힘든 연산자들이 몇몇 있었다. 이 때문에 구조를 각 자료구조의 이터레이터에 맞게 Algorithm 함수를 여러개로 오버로딩하는 방식으로 하기로 하였다.
일단 벡터의 이터레이터는 아래와 같이 필요한 연산자만 구현해놓았다.
더 필요하다면 추가로 구현할 것이고, 일단은 이정도만 구현해놓았다.
template<typename DataType>
class Vector<DataType>::Iterator
{
public:
Iterator()
{
}
Iterator(const DataType* _DataPtr)
{
DataPtr = const_cast<DataType*>(_DataPtr);
}
Iterator(const Iterator& _Other)
{
DataPtr = _Other.DataPtr;
}
Iterator& operator=(const Iterator& _Other)
{
DataPtr = _Other.DataPtr;
return *this;
}
Iterator& operator=(Iterator&& _Other)
{
DataPtr = _Other.ataPtr;
_Other.DataPtr = nullptr;
return *this;
}
bool operator==(const Iterator& _Other)
{
return (DataPtr == _Other.DataPtr);
}
bool operator!=(const Iterator& _Other)
{
return !(*this == _Other);
}
Iterator& operator++()
{
(DataPtr)++;
return *this;
}
Iterator operator++(int)
{
Iterator ReturnIter(*this);
++(*this);
return ReturnIter;
}
DataType operator*()
{
return *(DataPtr);
}
void Debug()
{
std::cout << *(DataPtr);
}
private:
DataType* DataPtr = nullptr;
};
벡터의 멤버함수에는 위의 이터레이터를 토대로 Begin과 End를 추가하였다.
Iterator Begin()
{
return Iterator(BeginPtr);
}
Iterator End()
{
return Iterator(EndPtr);
}
여러 자료구조간의 공통의 인터페이스를 구현하기 위해 상속을 사용할 필요는 있을 것 같은데, 아직은 어떤 식으로 디자인 할 지 감이 잘 안온다.
일단 벡터를 모두 마무리 하고, 리스트까지 만든 다음에 두 클래스의 구조를 비교하면서 고민해봐야 할 듯 하다.
'프로젝트 > STL 자료구조 구현' 카테고리의 다른 글
STL 자료구조 구현 (6) - 이터레이터 구조 변경 (0) | 2024.09.09 |
---|---|
STL 자료구조 구현 (5) - VectorBase 상속 및 멤버 함수 추가 (0) | 2024.09.05 |
STL 자료구조 구현 (4) - 예외 처리 (3) | 2024.09.04 |
STL 자료구조 구현 (2) _ Vector<bool> 특수화 (0) | 2024.07.21 |
STL 자료구조 구현 (1) - Vector (0) | 2024.07.19 |