Classes de coleção ATL

A ATL fornece muitas classes para armazenar e acessar dados. Sua decisão de qual classe usar depende de vários fatores, incluindo:

  • A quantidade de dados a serem armazenados

  • Eficiência versus desempenho no acesso aos dados

  • A capacidade de acessar os dados por índice ou por chave

  • Como os dados são ordenados

  • Preferência pessoal

Classes de coleção pequenas

A ATL fornece as seguintes classes de matriz para lidar com um pequeno número de objetos. No entanto, essas classes são limitadas e projetadas para uso interno pela ATL. Não é recomendável usá-las em seus programas.

Classe Tipo de armazenamento de dados
CSimpleArray Implementa uma classe de matriz para lidar com um pequeno número de objetos.
CSimpleMap Implementa uma classe de mapeamento para lidar com um pequeno número de objetos.

Classes de coleção de uso geral

As classes a seguir implementam matrizes, listas e mapas e são fornecidas como classes de coleta de uso geral:

Classe Tipo de armazenamento de dados
CAtlArray Implementa uma matriz.
CAtlList Implementa uma lista.
CAtlMap Implementa uma estrutura de mapeamento, na qual os dados podem ser referenciados por chave ou valor.
CRBMap Implementa uma estrutura de mapeamento usando o algoritmo vermelho-preto.
CRBMultiMap Implementa uma estrutura multimapeamento vermelho-preto.

Essas classes interceptarão muitos erros de programação quando usadas em builds de depuração, mas, por causa do desempenho, essas verificações não serão executadas em compilações de varejo.

Classes de coleção especializadas

Classes de coleção mais especializadas também são fornecidas para gerenciar ponteiros de memória e ponteiros de interface:

Classe Finalidade
CAutoPtrArray Fornece métodos úteis ao construir uma matriz de ponteiros inteligentes.
CAutoPtrList Fornece métodos úteis ao construir uma lista de ponteiros inteligentes.
CComUnkArray Armazena ponteiros IUnknown e foi projetada para ser usada como um parâmetro para a classe de modelo IConnectionPointImpl.
CHeapPtrList Fornece métodos úteis ao construir uma lista de ponteiros de heap.
CInterfaceArray Fornece métodos úteis ao construir uma matriz de ponteiros de interface COM.
CInterfaceList Fornece métodos úteis ao construir uma lista de ponteiros de interface COM.

Escolher uma classe de coleção

Cada uma das classes de coleção disponíveis oferece diferentes características de desempenho, conforme mostrado na tabela abaixo.

  • As colunas 2 e 3 descrevem as características de ordenação e acesso de cada classe. Na tabela, o termo "ordenado" significa que a ordem na qual os itens são inseridos e excluídos determina a ordem deles na coleção, mas isso não significa que os itens sejam classificados em seu conteúdo. O termo "indexado" significa que os itens na coleção podem ser recuperados por um índice inteiro, assim como itens em uma matriz típica.

  • As colunas 4 e 5 descrevem o desempenho de cada classe. Em aplicativos que exigem muitas inserções na coleção, a velocidade de inserção pode ser especialmente importante, embora para outros aplicativos, a velocidade de pesquisa talvez seja mais importante.

  • A coluna 6 descreve se cada forma permite elementos duplicados.

  • O desempenho de uma determinada operação de classe de coleção é expresso em termos da relação entre o tempo necessário para concluir a operação e o número de elementos na coleção. Uma operação com duração que aumenta linearmente à medida que o número de elementos aumenta é descrita como um algoritmo O(n). Por outro lado, uma operação com duração que aumenta cada vez menos à medida que o número de elementos aumenta é descrita como um algoritmo O(log n). Portanto, em termos de desempenho, os algoritmos O(log n) superam os algoritmos O(n) cada vez mais à medida que o número de elementos aumenta.

Recursos de forma da coleção

Forma Encomenda feita Indexado Inserir um

element
Procurar

elemento especificado
Duplicata

elementos
Lista Sim Não Rápido (tempo constante) O(n) lento Sim
Array Sim Por int (tempo constante) O(n) lento, exceto se inserir no final, nesse caso, tempo constante O(n) lento Sim
Mapeamento Não Por chave (tempo constante) Rápido (tempo constante) Rápido (tempo constante) Não (chaves) Sim (valores)
Mapa Vermelho-Preto Sim (por chave) O(log n) por chave O(log n) rápido O(log n) rápido Não
Multimapa Vermelho-Preto Sim (por chave) O(log n) por chave (vários valores por chave) O(log n) rápido O(log n) rápido Sim (vários valores por chave)

Usar objetos CTraits

Como as classes de coleção ATL podem ser usadas para armazenar uma ampla variedade de tipos de dados definidos pelo usuário, pode ser útil poder substituir funções importantes, tais como comparações. Isso é obtido usando as classes CTraits.

As classes CTraits são semelhantes, embora mais flexíveis do que as funções auxiliares da classe de coleção MFC. Confira Auxiliares de Classe de Coleção para saber mais.

Ao construir sua classe de coleção, você tem a opção de especificar uma classe CTraits. Essa classe conterá o código que executará operações, como comparações, quando chamadas pelos outros métodos que compõem a classe de coleção. Por exemplo, se o objeto de lista contiver suas próprias estruturas definidas pelo usuário, você talvez queira redefinir o teste de igualdade para comparar apenas determinadas variáveis de membro. Dessa forma, o método Find do objeto de lista funcionará de maneira mais útil.

Exemplo

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

Comentários

Para ver uma lista das classes CTraits, confira Classes de Coleção.

O diagrama a seguir mostra a hierarquia de classes para as classes CTraits.

Diagram that shows the traits hierarchy for collection classes.

Exemplos de classes de coleção

Os exemplos a seguir demonstram as classes de coleção:

Confira também

Conceitos
Classes de coleção