이번에는 STL의 list를 모델 삼아 list를 만들어 보기로 해요.
4장에서는 vector를 만들었습니다. 그 프로젝트에서 헤더파일 포함문과 using 문만 변경하세요.
//#include <vector> //#include <algorithm> //using std::vector; //using std::find; //using std::find_if; #include "list.h" #include "algorithm.h" using ehlib::list; typedef list<Genre *> Genres; typedef Genres::iterator GIter; typedef Genres::const_iterator GCIter;
물론 list.h 파일과 algorithm.h 파일을 프로젝트에 추가하세요. alogorithm은 4장에서 만든 것과 똑같습니다.
현재 구현한 것이 없기 때문에 프로젝트를 다시 빌드하면 컴파일 오류가 날 거예요. 오류가 나는 것을 하나 하나 수정하여 컴파일 오류만 나지 않게 하세요. 물론 코드 내부는 비어있는 상태입니다.
vector에서는 인덱스 연산자를 제공하지만 list에서는 인덱스 연산자를 제공하지 않습니다. 따라서 list는 순차적으로 보관하거나 특정 키 순으로 보관할 수 있지만 인덱스 연산은 사용할 수 없습니다. 또한 순차적으로 보관하거나 특정 키 순으로 보관하는 것은 list와 사용 방법이 같습니다.
4장에서 만든 세 개의 프로젝트 중에 순차적으로 보관하는 프로젝트와 특정 키 순으로 적용하면 다음과 같은 형태로 작성하면 컴파일 오류가 발생하지 않아요. 이게 이번 장에서 작성할 list의 뼈대입니다.
//list.h #pragma once namespace ehlib { template<typename Data> class list { public: class iterator { public: iterator() { } Data operator *()const { return 0; } iterator &operator++() { return (*this); } const iterator operator++(int) { iterator re(*this); return re; } bool operator !=(const iterator &iter)const { return false; } bool operator ==(const iterator &iter)const { return false; } }; typedef iterator const_iterator; list() { } ~list() { } void push_back(Data data) { } void insert(iterator at, Data data) { } void erase(iterator at) { } iterator begin() { iterator iter; return iter; } iterator end() { iterator iter; return iter; } const_iterator begin()const { iterator iter; return iter; } const_iterator end()const { iterator iter; return iter; } size_t size() { return 0; } }; }