Udostępnij za pośrednictwem


Klasy kolekcji ATL

Usługa ATL udostępnia wiele klas do przechowywania i uzyskiwania dostępu do danych. Która klasa, której chcesz użyć, zależy od kilku czynników, w tym:

  • Ilość danych do przechowywania

  • Wydajność a wydajność podczas uzyskiwania dostępu do danych

  • Możliwość uzyskiwania dostępu do danych według indeksu lub klucza

  • Jak są uporządkowane dane

  • Preferencje osobiste

Małe klasy kolekcji

ATL udostępnia następujące klasy tablic do obsługi niewielkiej liczby obiektów. Jednak te klasy są ograniczone i zaprojektowane do użytku wewnętrznie przez ATL. Nie zaleca się używania ich w programach.

Klasa Typ magazynu danych
CSimpleArray Implementuje klasę tablicy do obsługi niewielkiej liczby obiektów.
CSimpleMap Implementuje klasę mapowania do obsługi niewielkiej liczby obiektów.

Klasy kolekcji ogólnego przeznaczenia

Następujące klasy implementują tablice, listy i mapy oraz są udostępniane jako klasy kolekcji ogólnego przeznaczenia:

Klasa Typ magazynu danych
CAtlArray Implementuje tablicę.
Lista CAtlList Implementuje listę.
CAtlMap Implementuje strukturę mapowania, w której można odwoływać się do danych według klucza lub wartości.
CRBMap Implementuje strukturę mapowania przy użyciu algorytmu Red-Black.
CRBMultiMap Implementuje strukturę wielomapowania Red-Black.

Te klasy będą wychwytowywały wiele błędów programowania w przypadku użycia w kompilacjach debugowania, ale ze względu na wydajność te testy nie będą wykonywane w kompilacjach detalicznych.

Wyspecjalizowane klasy kolekcji

Bardziej wyspecjalizowane klasy kolekcji są również udostępniane do zarządzania wskaźnikami pamięci i wskaźnikami interfejsu:

Klasa Purpose
CAutoPtrArray Udostępnia metody przydatne podczas konstruowania tablicy inteligentnych wskaźników.
Lista CAutoPtrList Udostępnia metody przydatne podczas konstruowania listy inteligentnych wskaźników.
CComUnkArray IUnknown Przechowuje wskaźniki i jest przeznaczony do użycia jako parametr klasy szablonu IConnectionPointImpl.
CHeapPtrList Udostępnia metody przydatne podczas konstruowania listy wskaźników stert.
CInterfaceArray Udostępnia metody przydatne podczas konstruowania tablicy wskaźników interfejsu COM.
CInterfaceList Udostępnia metody przydatne podczas konstruowania listy wskaźników interfejsu COM.

Wybieranie klasy kolekcji

Każda z dostępnych klas kolekcji oferuje różne cechy wydajności, jak pokazano w poniższej tabeli.

  • Kolumny 2 i 3 opisują charakterystykę kolejności i dostępu każdej klasy. W tabeli termin "uporządkowany" oznacza, że kolejność wstawiania i usuwania elementów określa ich kolejność w kolekcji; nie oznacza to, że elementy są sortowane na ich zawartości. Termin "indeksowany" oznacza, że elementy w kolekcji mogą być pobierane przez indeks liczb całkowitych, podobnie jak elementy w typowej tablicy.

  • Kolumny 4 i 5 opisują wydajność każdej klasy. W aplikacjach wymagających wielu wstawiania do kolekcji szybkość wstawiania może być szczególnie ważna; w przypadku innych aplikacji szybkość wyszukiwania może być ważniejsza.

  • Kolumna 6 opisuje, czy każdy kształt zezwala na zduplikowane elementy.

  • Wydajność danej operacji klasy kolekcji jest wyrażona w kategoriach relacji między czasem wymaganym do ukończenia operacji a liczbą elementów w kolekcji. Operacja trwając czas, który zwiększa się liniowo w miarę wzrostu liczby elementów, jest opisywany jako algorytm O(n). Z kolei operacja trwającą okres, który zwiększa się mniej, ponieważ liczba elementów wzrasta, jest opisywana jako algorytm O(log n). Dlatego pod względem wydajności algorytmy O(log n) przewyższają algorytmy O(n) coraz bardziej w miarę wzrostu liczby elementów.

Funkcje kształtu kolekcji

Kształt Zamówiona Indeksowane Wstaw

— element
Wyszukaj

określony element
Duplikat

elementy
List Tak Nie. Szybki (stały czas) Powolne O(n) Tak
Tablica Tak Według int (czas stały) Powolne O(n) z wyjątkiem wstawiania na końcu, w którym przypadku stały czas Powolne O(n) Tak
Mapowanie Nie. Według klucza (czas stały) Szybki (stały czas) Szybki (stały czas) Nie (klucze) Tak (wartości)
Czerwona mapa Tak (według klucza) Według klucza O(dziennik n) Fast O(log n) Fast O(log n) Nie.
Mapa wielomapowa z czerwoną czarną Tak (według klucza) Według klucza O(log n) (wiele wartości na klucz) Fast O(log n) Fast O(log n) Tak (wiele wartości na klucz)

Korzystanie z obiektów CTraits

Ponieważ klasy kolekcji ATL mogą służyć do przechowywania szerokiej gamy typów danych zdefiniowanych przez użytkownika, przydatne może być zastąpienie ważnych funkcji, takich jak porównania. Jest to osiągane przy użyciu klas CTraits.

Klasy CTraits są podobne do, ale bardziej elastyczne niż funkcje pomocnicze klasy kolekcji MFC; Aby uzyskać więcej informacji, zobacz Pomocnicy klas kolekcji.

Podczas konstruowania klasy kolekcji można określić klasę CTraits. Ta klasa będzie zawierać kod, który będzie wykonywać operacje, takie jak porównania, gdy są wywoływane przez inne metody tworzące klasę kolekcji. Jeśli na przykład obiekt listy zawiera własne struktury zdefiniowane przez użytkownika, możesz ponownie zdefiniować test równości, aby porównać tylko niektóre zmienne składowe. W ten sposób metoda Find obiektu listy będzie działać w bardziej użyteczny sposób.

Przykład

Kod

// 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"));
}

Komentarze

Aby uzyskać listę klas CTraits, zobacz Klasy kolekcji.

Na poniższym diagramie przedstawiono hierarchię klas dla klas CTraits.

Diagram przedstawiający hierarchię cech dla klas kolekcji.

Przykłady klas kolekcji

W poniższych przykładach pokazano klasy kolekcji:

Zobacz też

Pojęcia
Klasy kolekcji