Compartir a través de


Clases de colección de ATL

ATL proporciona muchas clases para almacenar y acceder a los datos. La clase que decida utilizar depende de varios factores, incluyendo:

  • La cantidad de datos que hay que almacenar

  • Eficiencia frente a rendimiento en el acceso a los datos

  • La posibilidad de acceder a los datos por índice o por clave

  • Forma de ordenar los datos

  • Preferencia personal

Clases de colección pequeña

ATL proporciona las siguientes clases de matrices para tratar un número reducido de objetos. Sin embargo, estas clases son limitadas y están diseñadas para el uso interno de ATL. No se recomienda su uso en los programas.

Clase Tipo de almacenamiento de datos
CSimpleArray Implementa una clase de matriz para tratar números pequeños de objetos.
CSimpleMap Implementa una clase de matriz para tratar números pequeños de objetos.

Clases de colección de uso general

Las siguientes clases implementan matrices, listas y asignaciones, y se proporcionan como clases de colección de uso general:

Clase Tipo de almacenamiento de datos
CAtlArray Implementa una matriz.
CAtlList Implementa una lista.
CAtlMap Implementa una estructura de asignación, mediante la cual los datos pueden ser referenciados por clave o valor.
CRBMap Implementa una estructura de asignación utilizando el algoritmo Rojo-Negro.
CRBMultiMap Implementa una estructura multi-asignación Rojo-Negro.

Estas clases capturarán muchos errores de programación cuando se utilicen en las compilaciones de depuración, pero en aras del rendimiento, estas comprobaciones no se realizarán en las compilaciones minoristas.

Clases de colección especializadas

También se proporcionan clases de colección más especializadas para administrar los punteros de memoria y los punteros de interfaz:

Clase Propósito
CAutoPtrArray Proporciona métodos útiles cuando se construye una matriz de punteros inteligentes.
CAutoPtrList Proporciona métodos útiles cuando se construye una lista de punteros inteligentes.
CComUnkArray Almacena IUnknown punteros y está diseñado para ser utilizado como parámetro de la clase de plantilla IConnectionPointImpl.
CHeapPtrList Proporciona métodos útiles cuando se construye una lista de punteros del montón.
CInterfaceArray Proporciona métodos útiles cuando se construye una matriz de punteros de interfaz COM.
CInterfaceList Proporciona métodos útiles cuando se construye una lista de punteros de interfaz COM.

Elegir una clase de colección

Cada una de las clases de colección disponibles ofrece diferentes características de rendimiento, como se muestra en la siguiente tabla.

  • Las columnas 2 y 3 describen las características de clasificación y acceso de cada clase. En la tabla, el término "ordenado" significa que el orden en el que se insertan o eliminan los elementos determina su orden en la colección; no significa que los elementos se ordenan por su contenido. El término “indexado” significa que los elementos de la colección se pueden recuperar mediante un índice entero, como los elementos de una matriz estándar.

  • Las columnas 4 y 5 describen los resultados de cada clase. En aplicaciones que requieren muchas inserciones en la colección, la velocidad de inserción puede ser especialmente importante; para otras aplicaciones, puede ser más importante la velocidad de búsqueda.

  • En la columna 6 se describe si cada forma permite elementos duplicados.

  • El rendimiento de una determinada operación de clase de colección se expresa en términos de la relación entre el tiempo necesario para completar la operación y el número de elementos de la colección. Una operación que toma una cantidad de tiempo que aumenta linealmente a medida que aumenta el número de elementos se describe como un algoritmo O(n). Por el contrario, una operación que toma un tiempo que aumenta cada vez menos a medida que aumenta el número de elementos se describe como un algoritmo O(log n). Por lo tanto, en términos de rendimiento, los algoritmos O(log n) superan a los algoritmos O(n) cada vez más a medida que aumenta el número de elementos.

Características de la forma de colección

Forma Pedido .Indexado Insertar un

element
Buscar

elemento especifico
Duplicar

Elementos
Enumerar No Rápido (tiempo constante) Lento O(n)
Matriz Por int (tiempo constante) Lento O(n) excepto si se inserta al final, en cuyo caso el tiempo es constante Lento O(n)
Asignar No Por clave (tiempo constante) Rápido (tiempo constante) Rápido (tiempo constante) No (claves) Sí (valores)
Asignación Rojo-Negro Sí (por clave) Por clave O(log n) Rápido O(log n) Rápido O(log n) No
Multi-asignación Rojo-Negro Sí (por clave) Por clave O(log n) (valores múltiples por clave) Rápido O(log n) Rápido O(log n) Sí (valores múltiples por clave)

Uso de los objetos CTraits

Como las clases de colección ATL, pueden ser usadas para almacenar una amplia gama de tipos de datos definidos por el usuario, puede ser útil poder anular funciones importantes como las comparaciones. Esto se consigue al usar las clases CTraits.

Las clases CTraits son similares, pero más flexibles, a las funciones de ayuda de las clases de colección de MFC; consulte Ayudantes de clases de colección para obtener más información.

Al construir la clase de colección, tiene la opción de especificar una clase CTraits. Esta clase contendrá el código que realizará operaciones como las comparaciones cuando sean llamadas por los otros métodos que componen la clase colección. Por ejemplo, si su objeto de lista contiene sus propias estructuras definidas por el usuario, puede querer redefinir la prueba de igualdad para que solo compare ciertas variables miembro. De este modo, el método Find del objeto lista funcionará de forma más útil.

Ejemplo

Código

// 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"));
}

Comentarios

Para ver una lista de las clases de CTraits, consulte las Clases de colección.

El siguiente diagrama muestra la jerarquía de clases para las clases CTraits.

Diagram that shows the traits hierarchy for collection classes.

Ejemplos de Clases de colección

Los siguientes ejemplos demuestran las clases de colección:

Consulte también

Conceptos
Clases de colección