Classi di raccolte ATL
ATL fornisce molte classi per archiviare e accedere ai dati.La classe si decide di utilizzare dipende da numerosi fattori, tra cui:
La quantità di dati da memorizzare
Efficienza rispetto alle prestazioni quando si accede ai dati
La possibilità di accedere ai dati dall'indice o dalla chiave
Come i dati vengono ordinati
Le preferenze personali
Le classi di raccolte
ATL fornisce le classi di matrice per gestire un numero limitato di oggetti.Tuttavia, queste classi sono limitate e progettate per l'utilizzo internamente da ATL.Si consiglia di utilizzare nei programmi.
Classe |
Tipo di archiviazione dei dati |
---|---|
Implementa una classe di matrice per gestire un numero limitato di oggetti. |
|
Implementa una classe di mapping per gestire un numero limitato di oggetti. |
Classi di raccolte di utilizzo generale
Le classi di seguire implementano le matrici, elenchi e i mapping e vengono fornite come classi di raccolte di utilizzo generale:
Classe |
Tipo di archiviazione dei dati |
---|---|
Implementa una matrice. |
|
Implementa un elenco. |
|
Implementa una struttura di mapping, con cui i dati possono farvi riferimento da una chiave o un valore. |
|
Implementa una struttura di mapping tramite l'algoritmo Rosso- Nero. |
|
Implementa una struttura multimapping Rosso-Nera. |
Queste classi bloccheranno molti errori di programmazione se utilizzate nelle build di debug, ma a scopo delle prestazioni, questi controlli non vengono eseguiti nelle build per la vendita.
Classi di raccolte specializzate
Le classi di raccolte specializzate vengono fornite per gestire i puntatori alla memoria e i puntatori a interfaccia:
Classe |
Scopo |
---|---|
Fornisce metodi utili quando creano una matrice di puntatori intelligenti. |
|
Fornisce metodi utili quando creano un elenco con puntatori intelligenti. |
|
Archivia i puntatori IUnknown ed è progettato per essere utilizzato come parametro alla classe modello IConnectionPointImpl. |
|
Fornisce metodi utili quando creano un elenco con puntatori heap. |
|
Fornisce metodi utili quando creano una matrice di puntatori all'interfaccia COM. |
|
Fornisce metodi utili quando creano un elenco tramite puntatori all'interfaccia COM. |
Scegliere una classe di raccolte
Ognuna delle classi di raccolte disponibili sono disponibili le caratteristiche di prestazione diversi, come illustrato nella tabella riportata di seguito.
Le colonne 2 e 3 descrivono le caratteristiche dell'ordine e l'accesso a ogni classe.Nella tabella, il termine "ordinato" significa che l'ordine in cui gli elementi vengono inseriti ed eliminate determinare il relativo ordine nella raccolta; non significa che gli elementi vengono ordinati i relativi contenuti.Il termine "indicizzato" significa che gli elementi della raccolta possono essere recuperati da un intero, come gli elementi in una matrice tipica.
Le colonne 4 e 5 descrivono le prestazioni di ciascuna classe.Nelle applicazioni che richiedono molti inserimenti nella raccolta, la velocità di inserimento può essere particolarmente importante, per altre applicazioni, la velocità di ricerca può essere più importante.
La colonna 6 indica se ogni forma consente elementi duplicati.
Le prestazioni di un'operazione specifica la classe di raccolte sono espresse in termini di relazione tra il tempo necessario per completare l'esecuzione e il numero di elementi della raccolta.Un'operazione che richiede una quantità di tempo che aumenta linearmente quando il numero di aumenta di elementi viene descritto come O (n) algoritmo.Al contrario, un'operazione che richiede un punto che aumenta sempre meno quando il numero di aumenta di elementi viene descritto come O (algoritmo di log n).Pertanto, in termini di prestazioni, O (algoritmi del log n) supera la O (n) algoritmi sempre maggiore del numero di elementi.
Funzionalità di libreria di forme
Forma |
Ordinato? |
Indicizzato? |
Inserire element |
Cercare elemento specificato |
Duplicato elementi? |
---|---|---|---|---|---|
Elenco |
Sì |
No |
Veloce (tempo costante) |
Lenta o (n) |
Sì |
Matrice |
Sì |
Da int (tempo costante) |
Rallenti la O (n) tranne se inserimento alla fine, nel qual caso il tempo costante |
Lenta o (n) |
Sì |
Mappa |
No |
La chiave (tempo costante) |
Veloce (tempo costante) |
Veloce (tempo costante) |
Nessun (tasti) sì (valori) |
Mapping Rosso-Nero |
Sì (la chiave) |
La chiave O (log n) |
O veloce (log n) |
O veloce (log n) |
No |
Multimap Rosso-Nero |
Sì (la chiave) |
La chiave O (log n) (più valori per chiave) |
O veloce (log n) |
O veloce (log n) |
Sì (più valori per chiave) |
Utilizzo di oggetti di CTraits
Mentre le classi di raccolte ATL possono essere utilizzate per archiviare una vasta gamma di tipi di dati definiti dall'utente, può essere utile poter eseguire l'override delle funzioni principali come confrontare.Questo risultato si ottiene utilizzando le classi di CTraits.
Le classi di CTraits sono simili a, ma più flessibili di, le funzioni di supporto di classi collection MFC; vedere Supporto della classe di raccolta per ulteriori informazioni.
Nel creare la classe di raccolte, è possibile specificare una classe di CTraits.Questa classe contiene codice che esegue le operazioni come confrontare una volta chiamato con gli altri metodi che costituiscono la classe di raccolte.Ad esempio, se l'oggetto elenco contiene le proprie strutture definite dall'utente, è possibile ridefinire il test di uguaglianza per confrontare solo le variabili membro sicuri.In questo modo, il metodo di ricerca dell'oggetto elenco verrà eseguito in modo molto 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 di CTraits, vedere classi di raccolte.
Nel diagramma seguente viene illustrata la gerarchia di classi per le classi di CTraits.
Esempi di classi collection
I seguenti esempi vengono illustrate le classi di raccolte: