일단, 원래는 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을 구현해보아야겠다.

+ Recent posts