본문 바로가기
IT-개발,DB

[개발/MFC] MFC가 제공하는 List Class - CStringList

by SB리치퍼슨 2011. 8. 1.

■ MFC가 제공하는 List Class - CStringList




※ MFC 가 제공하는 List Class
  - 양방향 포인터를 가지는 이중 연결 리스트(Doubly-Linked List)
  - 리스트의 처음 부분을 가리키는 포인터(Head) 와 끝 부분을 가리키는 포인터(Tail)가 있다.
    따라서 어느 방향으로든 순환하는 것이 가능하다.

  MFC가 제공하는 List Class
  ① 템플릿 클래스 (Template Class)
  ② 비 템플릿 클래스 (Nontemplate Class)



① 템플릿 클래스 (Template Class)
  - afxtempl.h 헤더파일 필요.
  - 원하는 종류의 데이터 타입을 프로그래머가 결정
  - 비 템플릿 클래스가 제공하는 모든 기능을 구현할 수 있기 때문에 템플릿 클래스 사용을 권장.

 클래스 이름  데이터 타입  사용 예
 CList 프로그래머가 결정   CList<CPoint, CPoint &> list;


② 비 템플릿 클래스 (Nontemplate Class)
  - afxcoll.h 헤더 파일이 필요.
  - 자주 사용하는 데이터 타입을 곧바로 사용할 수 있다.
 클래스 이름  데이터 타입  사용 예
 CObList  CObject 포인터  CObList list;
 CPtrList  void 포인터  CPtrList list;
 CStringList  CString  CStringList list;

 CObList, CPtrList, CStringList 는 제공하는 멤버 함수의 이름과 사용법이 동일 하므로 하나의 클래스만 배워두면
다른 모든 클래스에도 동일하게 적용할 수 있다.

  - 멤버 함수
    CStringList : CStringList 객체 생성.
    GetHead : 리스트의 헤드 값을 돌려준다.    
    GetTail : 리스트이 테일 값을 돌려준다.
    RemoveHead : 리스트 헤드 값을 제거.
    RemoveTail : 리스트 테일 값을 제거.
    RemoveAll : 리스트의 모든 원소를 제거
    AddHead :  한 원소(또는 다른 리스트의 모든 원소들)을 리스트의 헤드에 붙인다.(새로운 헤드를 만는다는 뜻.)
    AddTail : 한 원소(또는 다른 리스트의 모든 원소들)을 리스트의 테일에 붙인다.(새로운 헤드를 만는다는 뜻)
    GetHeadPosition :  리스트의 헤드 원소 위치를 반환.
    GetTailPosition : 리스트의 테일 원소 위치를 반환.
    GetNext : 반복할 때 다음 원소를 얻는다
    GetPrev : 반복할 때 이전 원소를 얻는다.
    GetAt : 주어진 위치에서 원소를 얻는다
    SetAt :  주어진 위치에서 원소를 넣는다.  
    RemoveAt : 리스트에서 특정한 위치에 있는 원소를 제거.
    InsertBefore : 주어진 위치 이전에 새 원소를 삽입.
    InsertAfter : 주어진 위치 이후에 새 원소를 삽입.
    Find : 포인터 값에 의해 지정된 원소의 위치를 얻는다.
    FindIndex : 0부터 시작하는 인덱스를 기준으로 원소의 위치를 얻는다.
    Getcount : 리스트에서 총 원소의 개수를  구한다.
    IsEmpty : 비어 있는 리스트인지 테스트한다.

 

1. CStringList 사용 예

  - 리스트의 생성과 초기화
char *szFruits[] = {
    "사과",
    "딸기",
    "포도",
    "오렌지",
    "자두"
};

CStringList list;
for (int i = 0; i < 5; i++)
    list.AddTail(szFruits[i]);


  - 리스트 순환
POSITION pos = list.GetHeadPosition();
while(pos != NULL){
    CString string = list.GetNext(pos);
    cout << (LPCTSTR)string << endl;
}
cout << endl;

// 리스트 제일 뒤에서 출발하여 순환한다.
pos = list.GetTailPosition();
while(pos != NULL){
    CString string = list.GetPrev(pos);
    cout << (LPCTSTR)string << endl;
}
 

    ※ POSITION 타입의 변수은 pos는 GetNext(), GetPrev() 함수를 호출할 때마다 값이 바뀐다.


  - 리스트 항목 삽입과 삭제
pos = list.Find("포도");
list.InsertBefore(pos, "살구");
list.InsertAfter(pos, "바나나");
list.RemoveAt (pos);

// 항목 삽입과 삭제 후 결과를 확인한다.
pos = list.GetHeadPosition();
while(pos != NULL){
    CString string = list.GetNext(pos);
    cout << (LPCTSTR)string << endl;
}



 



출처: http://six605.tistory.com/169

반응형

댓글