Classes de coleção de ATL
ATL fornece muitas classes para armazenar e acessar dados.Classe que você decidir usar depende de vários fatores, incluindo:
A quantidade de dados a serem armazenados
Eficiência contra o desempenho sobre acessar os dados
A capacidade de acessar os dados pelo índice ou por chave
Como os dados são ordenados
Preferência pessoal
Classes de coleções pequenas
ATL fornece as seguintes classes de matriz para manipular um pequeno número de objetos.Em o entanto, essas classes são limitadas e criadas para uso internamente por ATL.Não é recomendável que você usa nos seus programas.
Classe |
Tipo de armazenamento de dados |
---|---|
Implementa uma classe de matriz para manipular um pequeno número de objetos. |
|
Implementa uma classe de mapeamento para manipular um pequeno número de objetos. |
Classes de coleção comumente usadas
As classes a seguir implementam, listas, matrizes e mapeia e são fornecidas como a coleção comumente usadas classe:
Classe |
Tipo de armazenamento de dados |
---|---|
Implementa uma matriz. |
|
Implementa uma lista. |
|
Implementa uma estrutura de mapeamento, pelo qual os dados podem ser referenciados por chave ou por valor. |
|
Implementa uma estrutura de mapeamento usando o algoritmo Vermelho- Preto. |
|
Implementa uma estrutura multimapping Vermelho-Preta. |
Essas classes interceptarão muitos erros de programação quando usadas em compilações de depuração, mas para a causa de desempenho, essas verificações não serão executadas em construções varejistas.
Classes de coleção especializadas
As classes mais especializadas de coleção são fornecidas também gerenciando ponteiros de memória e ponteiros a interface:
Classe |
Objetivo |
---|---|
Fornece métodos úteis quando construir uma matriz de ponteiros inteligentes. |
|
Fornece métodos úteis quando construir uma lista de ponteiros inteligentes. |
|
Armazena ponteiros de IUnknown e é projetado para ser usado como um parâmetro para a classe de modelo de IConnectionPointImpl . |
|
Fornece métodos úteis quando construir uma lista de ponteiros da heap. |
|
Fornece métodos úteis quando construir uma matriz de ponteiros da interface COM. |
|
Fornece métodos úteis quando construir uma lista de ponteiros da interface COM. |
Escolhendo uma classe de coleção
Cada uma das classes disponíveis de coleção oferece características de desempenho diferentes, como mostrado na tabela abaixo.
As colunas 2 e 3 descrevem cada classe de ordenação e acessam características.Em a tabela, o termo “pediu” significa que a ordem em que os itens excluídos são inseridos e determina a ordem na coleção; não significa que os itens são classificadas em seu conteúdo.O termo “indexado” significa que os itens na coleção podem ser recuperados por um índice inteiro, bem como itens em uma matriz típica.
As colunas 4 e 5 descrevem o desempenho de cada classe.Em aplicativos que requerem várias inserções na coleção, a velocidade de inserção pode ser especialmente importante; para outros aplicativos, a velocidade de pesquisa pode ser mais importante.
Descreve a coluna 6 se cada formulário permite elementos duplicados.
O desempenho de uma operação determinada de classe de coleção é expresso em termos de relação entre o tempo necessário para concluir a operação e o número de elementos na coleção.Uma operação que leva uma quantidade de tempo que aumenta linear como o número de gera de elementos é descrito como um algoritmo (O)n.Por outro lado, uma operação que recebe um período de tempo que disparam sempre menor que o número de gera de elementos é descrito como um algoritmo de O (log) em.Portanto, em termos de desempenho, algoritmos de O (log) em O outperform (em) algoritmos sempre mais como o número de elementos aumenta.
Recursos de forma de coleção
Forma |
Ordenada? |
Indexado? |
Insira elemento |
Procure por elemento especificado |
Duplicate elementos? |
---|---|---|---|---|---|
List |
Sim |
Não |
Rápido (tempo constantes) |
O lento (em) |
Sim |
Matriz |
Sim |
Int (tempo por constantes) |
Desacelerar O (em) exceto se inserção no final, em esse caso constante cronometra |
O lento (em) |
Sim |
Mapa |
Não |
Por chave (tempo constantes) |
Rápido (tempo constantes) |
Rápido (tempo constantes) |
Não (chaves) Sim (valores) |
Mapa Vermelho-Preto |
Sim (por chave) |
Por chave em O (log) |
Rápido no (log) |
Rápido no (log) |
Não |
Multimap Vermelho-Preto |
Sim (por chave) |
Por chave em O (log) (vários valores por chave) |
Rápido no (log) |
Rápido no (log) |
Sim (vários valores por chave) |
Usando objetos de CTraits
Como as classes de coleção de 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 como comparações.Isso é conseguido usando as classes de CTraits.
As classes de CTraits são semelhantes a, mas mais flexíveis do que, as funções auxiliares de classe de coleção MFC; consulte Coleção classe auxiliares para mais informações.
Quando construir sua classe de coleção, você tem a opção de especificar uma classe de CTraits.Essa classe conterá o código que irá executar operações como comparações quando chamado pelos outros métodos que compõem a classe de coleção.Por exemplo, se seu objeto de lista contém suas próprias estruturas definidos pelo usuário, você pode querer redefinir o teste de igualdade para comparar somente certos variáveis de membro.Assim, o método de localização do objeto de lista operar-se-á de uma 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 obter uma lista de classes de CTraits, consulte Classes de coleção.
O diagrama a seguir mostra a hierarquia de classe para as classes de CTraits.
A coleção de classes de exemplos
Os seguintes exemplos mostram as classes de coleção: