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 | Fin |
---|---|
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 | Sí | No | Rápido (tiempo constante) | Lento O(n) | Sí |
Matriz | Sí | Por int (tiempo constante) | Lento O(n) excepto si se inserta al final, en cuyo caso el tiempo es constante | Lento O(n) | Sí |
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.
Ejemplos de Clases de colección
Los siguientes ejemplos demuestran las clases de colección: