전 시간에 만들었던 이중연결 리스트에 몇가지 기능들을 추가 해 보았다.

  1. 반복자 추가
  2. 데이터 검색 기능
  3. 범용 데이터 저장을 위한 클래스 템플릿 작성

<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 클래스 멤버함수를 사용하여 간단하게 위치를 참조하였다.