STL 이터레이터에 대한 구조를 간단히 설명해 주네요.
http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Advanced-STL/C9-Lectures-Stephan-T-Lavavej-Advanced-STL-3-of-n
이민규 님이 쓰신 글 :
: C++ 형식으로 작성했는데 출력이 이상하게 나오네용
:
: template
: <typename T>
: 이렇게 썻습니다.!!
:
:
: #pragma once
: #include "DoublySortedLinkedList.h"
:
: template
: class Iterator
: {
: public:
: // Class constructor
: Iterator(const DoublySortedLinkedList &list): m_List(list), m_pCurrentPos(list.m_pFirst){};
: bool NotNull(); // list의 현재원소가 Null이 아닌지 검사
: bool NextNotNull(); // list의 다음원소가 Null이 아닌지 검사
: T First(); // list의 처음 node의 item을리턴
: T Next(); // 다음 node로 이동하고 해당node의 item을리턴
: NodeType GetCurrentNode(); // 현재 node를 리턴
: private:
: const DoublySortedLinkedList &m_List; //사용할리스트의참조변수
: NodeType *m_pCurrentPos; // Iterator
: friend class DoublySortedLinkedList;
: }
:
: ----------------------------------------------------------------------------------------------
:
:
: #pragma once
: #include "Iterator.h"
:
: template
: struct NodeType;
:
: template
: class DoublySortedLinkedList
: {
: public:
: DoublySortedLinkedList(); // Class constructor
: ~DoublySortedLinkedList(); // Class destructor
: bool IsFull(); // Check the memory
: void MakeEmpty(); // Initializes list to empty state.
: void InsertItem(T item); // Add item to list.
: void DeleteItem(T item); // Delete item from list.
: void ReplaceItem(T item); // Replace item in list.
: int GetLength() const; // Determines the number of elements in list.
: void RetrieveItem(T &item, bool&found); // Retrieves list element whose key matches item's key (if present).
:
: private:
: NodeType *m_pFirst; // 리스트의처음노드를가리키는포인터
: NodeType *m_pLast; // 리스트의마지막노드를가리키는포인터
: int m_nLength;
: friend class Iterator;
: };
:
: /*---------------------------------------------------------
: NodeType Structure
: 아이템, 앞을 가리키는 포인터, 뒤를 가리키는 포인터
: 3가지 변수를 갖는다.
: ----------------------------------------------------------*/
: template
: struct NodeType
: {
: T item; // 데이터가 저장될 item
: NodeType *prevPtr; // Pointer of previous node
: NodeType *nextPtr; // Pointer of next node
: };
:
: //Constructor
: template
: DoublySortedLinkedList::DoublySortedLinkedList()
: {
: *m_pFirst = NULL; // 리스트의처음노드를가리키는포인터
: *m_pLast = NULL; // 리스트의마지막노드를가리키는포인터
: m_nLength = 0;
: }
:
: //Destructor
: template
: DoublySortedLinkedList::~DoublySortedLinkedList()
: {
: //리스트 내의 모든 Node 제거
: MakeEmpty();
: }
:
:
: //====================================================================================
: // Function : Initializes list to empty state.
: // Pre : None
: // Post : List is empty.
: //====================================================================================
: template
: void DoublySortedLinkedList::MakeEmpty()
: // Post: List is empty; all items have been deallocated.
: {
: // 리스트내의 모든 노드 제거 하고 리스트의 length를 초기화
: NodeType *temp;
: while (m_pListData != NULL)
: {
: temp = m_pListData;
: m_pListData = m_pListData->next;
: delete temp;
: }
: m_nLength = 0;
: }
:
: //====================================================================================
: // Function : Determines the number of elements in list.
: // Post : Function value = number of elements in list.
: //====================================================================================
: template
: int DoublySortedLinkedList::GetLength() const
: {
: return m_nLength;
: }
:
:
: //====================================================================================
: // Function : Adds item to list.
: // Pre : none
: // Post : item is in list.
: //====================================================================================
: template
: void DoublySortedLinkedList::InsertItem(T item)
: {
: if ( !IsFull() ) // check dynamic allocation of node
: {
: NodeType *node = new NodeType; // 추가될 노드
:
: node->item = item;
: node->nextPtr = NULL;
: node->prevPtr = NULL;
:
: if (!m_nLength) // 길이가 0인 경우
: {
: m_pListData = node; // 리스트의 첫번째 데이터에 node를 삽입
: }
: else
: {
: // Iterator 를 사용하지 않고 그냥 ??
: // Iterator class를 이용하는건지 ??
: }
: m_nLength++;
: }
: }
:
: //====================================================================================
: // Function : Delete item from list.
: // Pre : none
: // Post : item is not in list.
: //====================================================================================
: template
: void DoublySortedLinkedList::DeleteItem(T item)
: {
: if ( m_nLength > 0 ) // 길이가 0보다 큰 경우
: {
: // 삭제 알고리즘
: // 미구현
: }
: cout << "\tNot Found Item" << endl; // 아이템을 찾지 못한경우 메세지 출력
: }
:
: //====================================================================================
: // Function : Replace item in list.
: // Pre : none
: // Post : item is in list and updated
: //====================================================================================
: template
: void DoublySortedLinkedList::ReplaceItem(T item)
: {
: bool found;
: T temp = item;
: RetrieveItem(temp, found); // item을 검색한다.
: if (found) // 찾게되면 repalce
: {
: m_pCurrentPos->item = item;
: cout << "\tUPDATE SUCCESS" << endl;
: }
: else // 찾지 못하면 메세지 출력
: {
: cout << "\tNot Found Item!" << endl;
: }
: }
:
: //====================================================================================
: // Function : Reterieves item from list.
: // Pre : none
: // Post : 찾을 경우 m_pCurPointer가 찾고자 하는 아이템을 가리킨다. found = true 가 된다.
: // 찾지 못할 경우 found = false;
: //====================================================================================
: template
: void DoublySortedLinkedList::RetrieveItem(T& item, bool& found)
: {
: T temp;
: ResetList();
: found = false;
:
: if ( m_nLength > 0 )
: {
: // 검색 알고리즘
: // 미구현
: }
: }
:
:
: 이렇게 했는데 자꾸 컴파일 에러가 뜨네요....ㅠㅠㅠ이유를 모르겠습니다.
:
:
: Error 21 error C1903: unable to recover from previous error(s); stopping compilation
: Error 42 error C1903: unable to recover from previous error(s); stopping compilation
: Error 14 error C2059: syntax error : '<'
: Error 19 error C2059: syntax error : '<'
: Error 35 error C2059: syntax error : '<'
: Error 40 error C2059: syntax error : '<'
: Error 3 error C2143: syntax error : missing ',' before '<'
: Error 24 error C2143: syntax error : missing ',' before '<'
: Error 4 error C2143: syntax error : missing ';' before '<'
: Error 8 error C2143: syntax error : missing ';' before '<'
: Error 10 error C2143: syntax error : missing ';' before '<'
: Error 25 error C2143: syntax error : missing ';' before '<'
: Error 29 error C2143: syntax error : missing ';' before '<'
: Error 31 error C2143: syntax error : missing ';' before '<'
: Error 1 error C2143: syntax error : missing ';' before 'template'
: Error 22 error C2143: syntax error : missing ';' before 'template'
: Error 6 error C2238: unexpected token(s) preceding ';'
: Error 9 error C2238: unexpected token(s) preceding ';'
: Error 12 error C2238: unexpected token(s) preceding ';'
: Error 15 error C2238: unexpected token(s) preceding ';'
: Error 27 error C2238: unexpected token(s) preceding ';'
: Error 30 error C2238: unexpected token(s) preceding ';'
: Error 33 error C2238: unexpected token(s) preceding ';'
: Error 36 error C2238: unexpected token(s) preceding ';'
: Error 13 error C2327: 'Iterator<T>::DoublySortedLinkedList' : is not a type name, static, or enumerator
: Error 34 error C2327: 'Iterator<T>::DoublySortedLinkedList' : is not a type name, static, or enumerator
: Error 20 error C2588: '::~DoublySortedLinkedList' : illegal global destructor
: Error 41 error C2588: '::~DoublySortedLinkedList' : illegal global destructor
: Error 18 error C2988: unrecognizable template declaration/definition
: Error 39 error C2988: unrecognizable template declaration/definition
: Error 16 error C2989: 'DoublySortedLinkedList' : class template has already been declared as a non-class template
: Error 37 error C2989: 'DoublySortedLinkedList' : class template has already been declared as a non-class template
: Error 17 error C3857: 'DoublySortedLinkedList': multiple template parameter lists are not allowed
: Error 38 error C3857: 'DoublySortedLinkedList': multiple template parameter lists are not allowed
: Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
: Error 5 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
: Error 7 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
: Error 11 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
:
: Error 23 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
: Error 26 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
: Error 28 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
: Error 32 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
:
: 처음보는 에러인데...당황스럽네요..ㅠㅠ
: 어떻게 해야 하나요..
:
:
:
: 아 그리구 위의 저런 ADT 를 가지고 구현할때요 이때 list class 에서
:
: insert 나 retrieve 메소드를 구현함에 friend 선언이 된 iterator를 내부적으로 생성해서 사용하는건가요??
: