전 시간에 만들었던 이중연결 리스트에 몇가지 기능들을 추가 해 보았다.
<aside> ❗ 반복자(iterator) = 특정 위치를 가르키는 포인터를 래핑해놓은 것
</aside>
Iterator & Operator << iterator에 대한 설명
전 시간에 구현했던 DoublyLinkedList와 다르게 iterator를 활용하여 코드를 새로이 작성해보겠다.
void insert(const iterator& pos, const T& val)
{
Node<T>* p = pos.ptr;
Node<T>* new_node = new Node<T> {val, p->prev, p};
new_node->prev->next = new_node;
new_node->next->prev = new_node;
count++;
}
Node* p를 const iterator& pos로 바꾸어주었다.
현재 iterator 클래스 내부에 ptr이 아래와같이 작성되어 있기 때문에
Node<T>* ptr;
iterator 클래스 형식 pos.ptr(Node<T>*ptr)은 Node<T>*p와 같은 형식으로 값을 대입할 수 있는 상황이다.
<erase(), pop_front(), pop_back()>구현
void erase(const iterator& pos)
{
Node<T>* p = pos.ptr;
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
count--;
}
void pop_front()
{
if (!empty())
erase(begin());
}
void pop_back()
{
if (!empty())
erase(--end());
}
erase함수도 Node* p 를 인자로 받았던 것을 iterator pos참조로 바꾸어주었고
Node<T>*p 설정으로 템플릿 클래스로 유동적으로 타입을 받을 수 있도록 해주었다.
pop_front같은 경우엔 erase(head→next)로 head의 다음 node를 삭제하는 작업을 했었지만
begin() 이라는 iterator 클래스 멤버함수를 사용하여 간단하게 위치를 참조하였다.