Condividi tramite


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

CSimpleArray

Implementa una classe di matrice per gestire un numero limitato di oggetti.

CSimpleMap

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

CAtlArray

Implementa una matrice.

CAtlList

Implementa un elenco.

CAtlMap

Implementa una struttura di mapping, con cui i dati possono farvi riferimento da una chiave o un valore.

CRBMap

Implementa una struttura di mapping tramite l'algoritmo Rosso- Nero.

CRBMultiMap

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

CAutoPtrArray

Fornisce metodi utili quando creano una matrice di puntatori intelligenti.

CAutoPtrList

Fornisce metodi utili quando creano un elenco con puntatori intelligenti.

CComUnkArray

Archivia i puntatori IUnknown ed è progettato per essere utilizzato come parametro alla classe modello IConnectionPointImpl.

CHeapPtrList

Fornisce metodi utili quando creano un elenco con puntatori heap.

CInterfaceArray

Fornisce metodi utili quando creano una matrice di puntatori all'interfaccia COM.

CInterfaceList

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

No

Veloce (tempo costante)

Lenta o (n)

Matrice

Da int (tempo costante)

Rallenti la O (n) tranne se inserimento alla fine, nel qual caso il tempo costante

Lenta o (n)

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

15e672bd.collapse_all(it-it,VS.110).gifCodice

// 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.

Gerarchia dei tratti delle classi Collection

Esempi di classi collection

I seguenti esempi vengono illustrate le classi di raccolte:

Vedere anche

Concetti

Classi di raccolte

Altre risorse

Concetti ATL