ATL – třídy kolekce
ATL poskytuje mnoho tříd pro ukládání a přístup k datům.Třídy, které se rozhodnete použít, závisí na několika faktorech, včetně:
Částka uložení dat
Účinnost a výkon přístupu k datům
Možnost přístupu k datům podle indexu nebo klíč
Způsob řazení dat.
Osobní předvolby
Malé kolekce tříd
ATL obsahuje následující třídy array pro malý počet objektů se zabývá.Tyto třídy se však omezené a určen pro interně ATL.Není vhodné je použít v programech.
Třída |
Úložiště dat |
---|---|
Implementuje třídu array pro malý počet objektů se zabývá. |
|
Implementuje třída mapování pro malý počet objektů se zabývá. |
Obecný účel kolekce tříd
Třídy postupujte zavést matice, seznamů a map a slouží jako univerzální kolekce tříd:
Třída |
Úložiště dat |
---|---|
Implementuje matice. |
|
Seznam implementuje. |
|
Implementuje mapování struktury, kterým data lze odkazovat pomocí klíče nebo hodnoty. |
|
Implementuje mapování struktury pomocí algoritmu červená-černá. |
|
Multimapping struktura implementuje červená-černá. |
Tyto třídy provede soutisk mnoho programových chyb v sestavení ladění, ale for sake of výkon, nebudou provedeny tyto kontroly v maloobchodní sestavení.
Specializované třídy kolekce
Další specializované třídy kolekce jsou k dispozici také pro správu paměti ukazatele a ukazatele rozhraní:
Třída |
Účel |
---|---|
Poskytuje metody, které jsou užitečné při vytváření pole inteligentní ukazatelů. |
|
Poskytuje metody, které jsou užitečné při vytváření seznamu inteligentní ukazatelů. |
|
Obchody IUnknown ukazatelů a je určen k použití jako parametr IConnectionPointImpl šablonu třídy. |
|
Poskytuje metody, které jsou užitečné při vytváření seznamu ukazatelů haldy. |
|
Poskytuje metody, které jsou užitečné při vytváření pole ukazatele rozhraní COM. |
|
Poskytuje metody, které jsou užitečné při vytváření seznamu ukazatelů rozhraní COM. |
Kolekce třídy pro výběr
Každou ze tříd dostupné kolekce nabízí různé charakteristiky, jak je znázorněno v následující tabulce.
Sloupce 2 a 3 popisují řazení jednotlivých tříd a přístup k vlastnosti.V tabulce "objednáno" rozumí že určuje pořadí, ve kterém jsou položky vkládání a odstraňování jejich pořadí kolekce. To však neznamená, že položky jsou seřazeny na jejich obsah.Termín "indexovaných" znamená, že položky v kolekci může načíst celé číslo indexu, podobně jako typické pole položky.
Sloupce 4 a 5 popisují jednotlivé třídy výkonu.V aplikacích, které vyžadují mnoho vkládání do kolekce může být rychlost vkládání zvláště důležité. pro ostatní aplikace může být důležitější rychlost vyhledávání.
Sloupec 6 popisuje, zda každý obrazec může obsahovat duplicitní prvky.
Výkon operace třídy dané kolekce vyjadřuje vztah mezi čas potřebný k dokončení operace a počet prvků v kolekci.Přičemž dobu operace, lineárně zvyšuje počet zvyšuje prvky popsané jako algoritmus O(n).Naopak operace, přičemž časový úsek, který zvyšuje méně jako počet prvků zvýšení je popsán jako algoritmus O (n protokolu).S ohledem na výkon, proto na algoritmy (protokol n) O výrazně překonat algoritmy O(n) více jako počet prvků zvyšuje.
Funkce kolekce obrazce
Obrazce |
Objednané? |
Indexovány? |
Vložit prvek |
Hledat Zadaný prvek |
Duplikovat prvky? |
---|---|---|---|---|---|
Seznam |
Ano |
Ne |
Rychlé (konstantní čas) |
Pomalé O(n). |
Ano |
Pole |
Ano |
Podle int (čas konstantní) |
Pomalé O(n) kromě Pokud vložení na konci, kdy konstantní případu |
Pomalé O(n). |
Ano |
Mapa |
Ne |
Klíčem (konstantní čas) |
Rychlé (konstantní čas) |
Rychlé (konstantní čas) |
Žádné (klíče) Ano (hodnoty) |
Mapa červená černá |
Ano (klíčem) |
Klíčem O (n protokolu) |
O rychlé (protokol n) |
O rychlé (protokol n) |
Ne |
Vícenásobné mapování červená černá |
Ano (klíčem) |
Klíč O(log n) (vícenásobné hodnoty dle klíče) |
O rychlé (protokol n) |
O rychlé (protokol n) |
Ano (vícenásobné hodnoty dle klíče) |
Použití objektů CTraits
Jako kolekce třídy ATL lze použít k uložení širokou škálu typů dat definovaných uživatelem, může být užitečné mít možnost přepsat důležité funkce, například porovnání.Toho lze dosáhnout pomocí třídy CTraits.
CTraits třídy jsou podobné, ale flexibilnější než MFC kolekce třídy pomocné funkce; Viz Pomocné rutiny třídy kolekce Další informace.
Při vytváření kolekce třídy, máte možnost určit třídu CTraits.Tato třída bude obsahovat kód, který bude provádět operace jako porovnání volání metody, které tvoří kolekce třídy.Například pokud objekt seznamu obsahuje vlastní struktury definované uživatelem, můžete předefinovat test rovnosti porovnat pouze určité členské proměnné.Tímto způsobem najít metodu objektu seznamu pracovat způsobem užitečnější.
Příklad
Kód
// 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"));
}
Komentáře
Seznam tříd CTraits, viz Třídy kolekce.
Následující diagram znázorňuje hierarchie třídy pro třídy CTraits.
Kolekce třídy vzorků
Následující ukázky prokázat kolekce tříd: