다음을 통해 공유


ATL 컬렉션 클래스

ATL은 데이터를 저장하고 액세스하기 위한 많은 클래스를 제공합니다. 사용하기로 결정한 클래스는 다음을 비롯한 여러 요인에 따라 달라집니다.

  • 저장할 데이터 양

  • 데이터 액세스의 효율성과 성능 비교

  • 인덱스 또는 키로 데이터에 액세스하는 기능

  • 데이터 순서 지정 방법

  • 개인 기본 설정

작은 컬렉션 클래스

ATL은 적은 수의 개체를 처리하기 위해 다음 배열 클래스를 제공합니다. 그러나 이러한 클래스는 제한되며 ATL에서 내부적으로 사용하도록 설계되었습니다. 프로그램에서 사용하지 않는 것이 좋습니다.

클래스 데이터 스토리지 유형
CSimpleArray 적은 수의 개체를 처리하기 위한 배열 클래스를 구현합니다.
CSimpleMap 적은 수의 개체를 처리하기 위한 매핑 클래스를 구현합니다.

범용 컬렉션 클래스

다음 클래스는 배열, 목록 및 맵을 구현하고 범용 컬렉션 클래스로 제공됩니다.

클래스 데이터 스토리지 유형
CAtlArray 배열을 구현합니다.
CAtlList 목록을 구현합니다.
CAtlMap 키 또는 값으로 데이터를 참조할 수 있는 매핑 구조를 구현합니다.
CRBMap Red-Black 알고리즘을 사용하여 매핑 구조를 구현합니다.
CRBMultiMap Red-Black 멀티맵 구조를 구현합니다.

이러한 클래스는 디버그 빌드에서 사용할 때 많은 프로그래밍 오류를 트래핑하지만 성능을 위해 소매 빌드에서는 이러한 검사가 수행되지 않습니다.

특수 컬렉션 클래스

또한 메모리 포인터 및 인터페이스 포인터를 관리하기 위해 보다 특수화된 컬렉션 클래스가 제공됩니다.

클래스 목적
CAutoPtrArray 스마트 포인터 배열을 생성할 때 유용한 메서드를 제공합니다.
CAutoPtrList 스마트 포인터 목록을 생성할 때 유용한 메서드를 제공합니다.
CComUnkArray 포인터를 저장 IUnknown 하고 IConnectionPointImpl 템플릿 클래스에 대한 매개 변수로 사용하도록 설계되었습니다.
CHeapPtrList 힙 포인터 목록을 생성할 때 유용한 메서드를 제공합니다.
CInterfaceArray COM 인터페이스 포인터의 배열을 생성할 때 유용한 메서드를 제공합니다.
CInterfaceList COM 인터페이스 포인터 목록을 생성할 때 유용한 메서드를 제공합니다.

컬렉션 클래스 선택

사용 가능한 각 컬렉션 클래스는 아래 표와 같이 다양한 성능 특성을 제공합니다.

  • 열 2와 3은 각 클래스의 순서 지정 및 액세스 특성을 설명합니다. 이 표에서 "정렬 여부"는 항목이 삽입되고 삭제되는 순서가 컬렉션의 순서에 따라 결정되는 것을 의미하며 항목이 내용에 따라 정렬된다는 것을 의미하지는 않습니다. "인덱스 여부"는 컬렉션의 항목을 일반 배열의 항목처럼 정수 인덱스로 검색할 수 있음을 의미합니다.

  • 열 4와 5는 각 클래스의 성능을 설명합니다. 컬렉션에 항목을 많이 삽입해야 하는 애플리케이션에서는 삽입 속도가 특히 중요합니다. 다른 애플리케이션에서는 조회 속도가 더 중요할 수도 있습니다.

  • 6번 열에서는 각 모양에 요소가 중복될 수 있는지 여부에 대해 설명합니다.

  • 지정된 컬렉션 클래스 작업의 성능은 작업을 완료하는 데 필요한 시간과 컬렉션의 요소 수 간의 관계로 표현됩니다. 요소 수가 증가함에 따라 선형으로 증가하는 시간이 걸리는 작업은 O(n) 알고리즘으로 설명됩니다. 반면, 요소 수가 증가함에 따라 증가하는 시간이 걸리는 작업은 O(log n) 알고리즘으로 설명됩니다. 따라서 성능 측면에서 O(log n) 알고리즘은 요소 수가 증가함에 따라 O(n) 알고리즘을 점점 더 능가합니다.

컬렉션 모양 특징

도형 주문됨 Indexed 다음을 삽입합니다.

요소
검색 대상

지정된 요소
중복

요소
List 아니요 빠른 시간(일정 시간) 느린 O(n)
배열 int(상수 시간) 기준 끝에 삽입하는 경우를 제외하고 느린 O(n)이며, 이 경우 상수 시간입니다. 느린 O(n)
지도 아니요 키 기준(상수 시간) 빠른 시간(일정 시간) 빠른 시간(일정 시간) 아니요(키) 예(값)
빨강-검정 지도 예(키 기준) 키별 O(log n) Fast O(log n) Fast O(log n) 아니요
빨강 검정 멀티맵 예(키 기준) 키별 O(log n)(키당 여러 값) Fast O(log n) Fast O(log n) 예(키당 여러 값)

CTraits 개체 사용

ATL 컬렉션 클래스를 사용하여 광범위한 사용자 정의 데이터 형식을 저장할 수 있으므로 비교와 같은 중요한 함수를 재정의하는 것이 유용할 수 있습니다. 이는 CTraits 클래스를 사용하여 수행됩니다.

CTraits 클래스는 MFC 컬렉션 클래스 도우미 함수와 비슷하지만 더 유연합니다. 자세한 내용은 컬렉션 클래스 도우미를 참조 하세요 .

컬렉션 클래스를 생성할 때 CTraits 클래스를 지정하는 옵션이 있습니다. 이 클래스에는 컬렉션 클래스를 구성하는 다른 메서드에서 호출할 때 비교와 같은 작업을 수행하는 코드가 포함됩니다. 예를 들어 목록 개체에 사용자 정의 구조가 포함된 경우 같음 테스트를 다시 정의하여 특정 멤버 변수만 비교할 수 있습니다. 이러한 방식으로 목록 개체의 Find 메서드는 더 유용한 방식으로 작동합니다.

예시

코드

// Collection class / traits class example.
// This program demonstrates using a CTraits class
// to create a new comparison operator.

#define MAX_STRING 80

// Define our own data type to store in the list.

struct MyData 
{
   int ID;
   TCHAR name[MAX_STRING];
   TCHAR address[MAX_STRING];
};

// Define our own traits class, making use of the
// existing traits and overriding only the comparison
// we need.

class MyTraits : public CElementTraits< MyData >
{
public:
    // Override the comparison to only compare
    // the ID value.

   static bool CompareElements(const MyData& element1, const MyData& element2)
   {
      if (element1.ID == element2.ID)
         return true;
      else
         return false;
   };
};

void DoAtlCustomTraitsList()
{
   // Declare the array, with our data type and traits class 

   CAtlList < MyData, MyTraits > MyList;

   // Create some variables of our data type

   MyData add_item, search_item;

   // Add some elements to the list.

   add_item.ID = 1;
   _stprintf_s(add_item.name, _T("Rumpelstiltskin"));
   _stprintf_s(add_item.address, _T("One Grimm Way"));

   MyList.AddHead(add_item);

   add_item.ID = 2;
   _stprintf_s(add_item.name, _T("Rapunzel"));
   _stprintf_s(add_item.address, _T("One Grimm Way"));

   MyList.AddHead(add_item);

   add_item.ID = 3;
   _stprintf_s(add_item.name, _T("Cinderella"));
   _stprintf_s(add_item.address, _T("Two Grimm Way"));

   MyList.AddHead(add_item);

   // Create an element which will be used
   // to search the list for a match.

   search_item.ID = 2;
   _stprintf_s(search_item.name, _T("Don't care"));
   _stprintf_s(search_item.address, _T("Don't care"));

   // Perform a comparison by searching for a match
   // between any element in the list, and our
   // search item. This operation will use the
   // (overridden) comparison operator and will
   // find a match when the IDs are the same.

   POSITION i;

   i = MyList.Find(search_item);

   if (i != NULL)
      _tprintf_s(_T("Item found!\n"));
   else
      _tprintf_s(_T("Item not found.\n"));
}

설명

CTraits 클래스 목록은 컬렉션 클래스를 참조 하세요.

다음 다이어그램에서는 CTraits 클래스의 클래스 계층 구조를 보여 줍니다.

컬렉션 클래스의 특성 계층 구조를 보여 주는 다이어그램

컬렉션 클래스 샘플

다음 샘플에서는 컬렉션 클래스를 보여 줍니다.

참고 항목

개념
컬렉션 클래스