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.
Przykłady klas kolekcji
W poniższych przykładach pokazano klasy kolekcji: