일단, 원래는 Node 클래스가 List 내부에 있었는데 이를 외부로 뺐다.
그리고 양방향 이터레이터, List, Map, Set이 모두 같은 Node클래스를 공유해서 구현되도록 할 예정이다.
이를 기반으로 양방향 이터레이터의 연산자를 몇개 오버로딩해보았다.
template<typename DataType>
class BidirectionalIterator
{
using Node = typename Node<DataType>;
public:
BidirectionalIterator(const Node* _Node)
{
NodePtr = const_cast<Node*>(_Node);
}
BidirectionalIterator(Node&& _Node)
{
NodePtr = _Node;
_Node.PrevNode = nullptr;
_Node.NextNode = nullptr;
}
const DataType& operator*()
{
return NodePtr->Data;
}
BidirectionalIterator& operator--()
{
NodePtr = NodePtr->PrevNode;
return *this;
}
BidirectionalIterator operator--(int)
{
Node* ReturnNode = NodePtr;
NodePtr = NodePtr->PrevNode;
return BidirectionalIterator(ReturnNode);
}
BidirectionalIterator& operator++()
{
NodePtr = NodePtr->NextNode;
return *this;
}
BidirectionalIterator operator++(int)
{
Node* ReturnNode = NodePtr;
NodePtr = NodePtr->NextNode;
return BidirectionalIterator(ReturnNode);
}
private:
Node* NodePtr = nullptr;
};
간단하게 추가를 했고, 제대로 사용하기 위해선 연산자가 좀 더 필요한데 일단 추후에 추가하기로 하고
List에도 이 이터레이터를 기반으로 Begin과 End를 추가하였다.
using Node = typename Node<DataType>;
using Iterator = typename BidirectionalIterator<DataType>;
일단 이렇게 using 구문을 추가해주고..
Iterator Begin()
{
return Iterator(Head->NextNode);
}
Iterator End()
{
return Iterator(Tail);
}
이렇게 begin과 end를 간단하게 추가하였다.,
Head와 Tail은 더미노드라서 Begin 은 Head의 NextNode를 해주었다.
End는 원래 마지막 데이터의 다음 노드를 가리키기 때문에 Tail을 그대로 리턴해주었다.
일단 테스트 해봤는데 컴파일도 잘되고 기능도 문제 없는듯 하다.
일단 다음에 연산자를 몇개 추가하고 List의 멤버함수를 좀 더 추가한 다음
Map과 Set을 구현해보아야겠다.
'프로젝트 > STL 자료구조 구현' 카테고리의 다른 글
STL 자료구조 구현 (10) - Set 기능 일부 구현 (0) | 2024.09.15 |
---|---|
STL 자료구조 구현 (9) - 노드 구조 수정 (0) | 2024.09.15 |
STL 자료구조 구현 (7) - 예외 처리 구조 변경, List 일부 구현 (0) | 2024.09.10 |
STL 자료구조 구현 (6) - 이터레이터 구조 변경 (0) | 2024.09.09 |
STL 자료구조 구현 (5) - VectorBase 상속 및 멤버 함수 추가 (0) | 2024.09.05 |