Condividi tramite


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

Elemento
Cerca

elemento specificato
Duplicato

Elementi figlio
List No Veloce (tempo costante) O(n) lento
Array By int (tempo costante) Lento O(n) tranne se l'inserimento alla fine, nel qual caso il tempo costante O(n) lento
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.

Diagramma che mostra la gerarchia dei tratti per le classi di raccolta.

Esempi di classi di raccolta

Gli esempi seguenti illustrano le classi di raccolta:

Vedi anche

Concetti
Classi di raccolta