Classi di raccolta ATL
ATL offre molte classi per l'archiviazione e l'accesso ai dati. La classe da usare dipende da diversi fattori, tra cui:
Quantità di dati da archiviare
Efficienza e prestazioni nell'accesso ai dati
Possibilità di accedere ai dati in base all'indice o alla chiave
Modalità di ordinamento dei dati
Preferenza personale
Classi di raccolte di piccole dimensioni
ATL fornisce le classi di matrice seguenti per gestire un numero ridotto di oggetti. Tuttavia, queste classi sono limitate e progettate per l'uso internamente da ATL. Non è consigliabile usarli nei programmi.
Classe | Tipo di archiviazione dei dati |
---|---|
CSimpleArray | Implementa una classe di matrice per gestire un numero ridotto di oggetti. |
CSimpleMap | Implementa una classe di mapping per gestire un numero ridotto di oggetti. |
Classi di raccolta per utilizzo generico
Le classi seguenti implementano matrici, elenchi e mappe e vengono fornite come classi di raccolta per utilizzo generico:
Classe | Tipo di archiviazione dei dati |
---|---|
CAtlArray | Implementa una matrice. |
CAtlList | Implementa un elenco. |
CAtlMap | Implementa una struttura di mapping, in cui è possibile fare riferimento ai dati in base a chiave o valore. |
CRBMap | Implementa una struttura di mapping usando l'algoritmo Red-Black. |
CRBMultiMap | Implementa una struttura a più mapping rosso-nero. |
Queste classi intercettare molti errori di programmazione quando vengono usati nelle compilazioni di debug, ma per motivi di prestazioni, questi controlli non verranno eseguiti nelle build di vendita al dettaglio.
Classi di raccolte specializzate
Sono inoltre disponibili classi di raccolta più specializzate per la gestione dei puntatori di memoria e dei puntatori di interfaccia:
Classe | Scopo |
---|---|
CAutoPtrArray | Fornisce metodi utili quando si costruisce una matrice di puntatori intelligenti. |
CAutoPtrList | Fornisce metodi utili per la creazione di un elenco di puntatori intelligenti. |
CComUnkArray | Archivia IUnknown i puntatori ed è progettato per essere usato come parametro per la classe modello IConnectionPointImpl . |
CHeapPtrList | Fornisce metodi utili per la creazione di un elenco di puntatori heap. |
CInterfaceArray | Fornisce metodi utili quando si costruisce una matrice di puntatori di interfaccia COM. |
CInterfaceList | Fornisce metodi utili per la creazione di un elenco di puntatori all'interfaccia COM. |
Scelta di una classe di raccolta
Ognuna delle classi di raccolta disponibili offre caratteristiche di prestazioni diverse, come illustrato nella tabella seguente.
Le colonne 2 e 3 descrivono le caratteristiche di ordinamento e accesso di ogni classe. Nella tabella il termine "ordine" significa che l'ordine di inserimento ed eliminazione degli elementi determina il relativo ordine nella raccolta. Non significa che gli elementi sono ordinati in base al rispettivo contenuto. Il termine "indicizzazione" significa che è possibile recuperare gli elementi nella raccolta da un indice Integer, analogamente agli elementi in una matrice standard.
Le colonne 4 e 5 descrivono le prestazioni di ogni classe. In applicazioni che richiedono molte operazioni di inserimento nella raccolta, la velocità di inserimento potrebbe essere particolarmente importante. In altre applicazioni potrebbe essere più importante la velocità di ricerca.
La colonna 6 indica se ogni forma consente elementi duplicati.
Le prestazioni di un'operazione di classe di raccolta specificata sono espresse in termini di relazione tra il tempo necessario per completare l'operazione e il numero di elementi nella raccolta. Un'operazione che richiede un periodo di tempo che aumenta in modo lineare man mano che il numero di elementi aumenta viene descritto come algoritmo O(n). Al contrario, un'operazione che richiede un periodo di tempo che aumenta meno e meno man mano che il numero di elementi aumenta viene descritto come algoritmo O(log n). Pertanto, in termini di prestazioni, gli algoritmi O(log n) superano sempre di più gli algoritmi O(n) man mano che aumenta il numero di elementi.
Funzionalità delle forme di raccolta
Forma | Quantità ordinata | Indicizzato | Inserire un element |
Cerca elemento specificato |
Duplicato Elementi figlio |
---|---|---|---|---|---|
List | Sì | No | Veloce (tempo costante) | O(n) lento | Sì |
Array | Sì | By int (tempo costante) | Lento O(n) tranne se l'inserimento alla fine, nel qual caso il tempo costante | O(n) lento | Sì |
Mapping | No | Per chiave (tempo costante) | Veloce (tempo costante) | Veloce (tempo costante) | No (chiavi) Sì (valori) |
Mappa rossa-nera | Sì (per chiave) | Per chiave O(log n) | Fast O(log n) | Fast O(log n) | No |
Multimap rosso-nero | Sì (per chiave) | Per chiave O(log n) (più valori per chiave) | Fast O(log n) | Fast O(log n) | Sì (più valori per chiave) |
Uso di oggetti CTraits
Poiché le classi di raccolta ATL possono essere usate per archiviare un'ampia gamma di tipi di dati definiti dall'utente, può essere utile eseguire l'override di funzioni importanti come i confronti. Questo risultato viene ottenuto usando le classi CTraits.
Le classi CTraits sono simili, ma più flessibili rispetto alle funzioni helper della classe di raccolta MFC; per altre informazioni, vedere Collection Class Helpers (Helper di classi di raccolta).
Quando si costruisce la classe di raccolta, è possibile specificare una classe CTraits. Questa classe conterrà il codice che eseguirà operazioni quali confronti quando vengono chiamati dagli altri metodi che costituiscono la classe di raccolta. Ad esempio, se l'oggetto elenco contiene le proprie strutture definite dall'utente, è possibile ridefinire il test di uguaglianza per confrontare solo determinate variabili membro. In questo modo, il metodo Find dell'oggetto list funzionerà in modo più utile.
Esempio
Codice
// 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"));
}
Commenti
Per un elenco delle classi CTraits, vedere Classi di raccolta.
Il diagramma seguente illustra la gerarchia di classi per le classi CTraits.
Esempi di classi di raccolta
Gli esempi seguenti illustrano le classi di raccolta: