Classes de coleção do ATL
ATL fornece várias classes para armazenar e acessar dados.Classe que você decida usar depende de vários fatores, incluindo:
A quantidade de dados sejam armazenados
Eficiência em vez de desempenho no acesso 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ção pequeno
ATL fornece as seguintes classes de matriz para lidar com um pequeno número de objetos.No entanto, essas classes são limitadas e projetados para ser usado internamente pelo ATL.Não é recomendável que você os utilize em seus programas.
Classe |
Tipo de armazenamento de dados |
---|---|
Implementa uma classe de matriz para lidar com um pequeno número de objetos. |
|
Implementa uma classe de mapeamento para lidar com um pequeno número de objetos. |
Classes de coleção propósito geral
sistema autônomo classes a seguir implementam matrizes, listas e mapas e são fornecidas sistema autônomo classes de coleção de propósito geral:
Classe |
Tipo de armazenamento de dados |
---|---|
Implementa uma matriz. |
|
Implementa uma lista. |
|
Implementa uma estrutura de mapeamento, na qual os dados podem ser referenciados por chave ou valor. |
|
Implementa uma estrutura de mapeamento usando o algoritmo de Red-preta. |
|
Implementa uma estrutura multimapping vermelho-preto. |
Essas classes interceptará muitos erros de programação quando usado em compilações de depurar, mas para fins de desempenho, essas verificações não serão executadas em compilações comerciais.
Classes de coleção especializados
Mais especializadas de coleções de classes também são fornecidas para o gerenciamento de memória ponteiros e ponteiros de interface:
Classe |
Objetivo |
---|---|
Fornece métodos úteis ao construir uma matriz de SMART ponteiros. |
|
Fornece métodos úteis ao construir uma lista dos ponteiros inteligentes. |
|
Armazenamentos de IUnknown ponteiros e é projetado para ser usado sistema autônomo um parâmetro para o IConnectionPointImplclasse de modelo . |
|
Fornece métodos úteis ao construir uma lista dos ponteiros de heap. |
|
Fornece métodos úteis ao construir uma matriz de ponteiros de interface COM. |
|
Fornece métodos úteis ao construir uma lista dos ponteiros de interface COM. |
Escolhendo uma classe de coleção
Cada uma das classes de coleção disponível oferece características de desempenho diferentes, sistema autônomo mostrado na tabela abaixo.
Colunas 2 e 3 descrevem cada classe de pedidos e características de acesso.Na tabela, o termo "ordenado" significa que a ordem em que itens são inseridas e excluídas determina a ordem na coleção; isso não significa que os itens são classificados em seu Sumário.O termo "indexado" significa que os itens na coleção podem ser recuperados por um índice de inteiro, como itens em uma matriz normal.
Colunas 4 e 5 descrevem o desempenho de cada classe.Em aplicativos que exigem muitos inserções na coleção, inserção velocidade pode ser especialmente importante; para outros aplicativos, velocidade de pesquisa pode ser mais importante.
Coluna 6 descreve se cada forma permite que elementos duplicados.
O desempenho de uma operação de classe determinada coleção é expressa em termos da relação entre o time necessário para concluir a operação e o número de elementos na coleção.Uma operação de levar um período de time que aumenta linearmente conforme o número de elementos aumenta é descrito sistema autônomo um algoritmo O(n).Por outro lado, uma operação de levar um período de time que aumenta a menos conforme o aumento do número de elementos é descrita sistema autônomo um algoritmo O (log n).Portanto, em termos de desempenho, O (log n) algoritmos superam O(n) algoritmos mais sistema autônomo o número de elementos incresistema autônomoes.
Recursos de forma da coleção
Forma |
Solicitadas? |
Indexado? |
Inserir um element |
Procurar elemento especificado |
Duplicar elementos? |
---|---|---|---|---|---|
List |
Sim |
Não |
Rápida (time constante) |
O(n) lenta |
Sim |
Matriz |
Sim |
Por int (time constante) |
O(n) lenta, exceto se inserção no participante, no qual horário constante maiúsculas |
O(n) lenta |
Sim |
MAP |
Não |
Pela chave (time constante) |
Rápida (time constante) |
Rápida (time constante) |
Nenhum (chaves) Sim (valores) |
MAP de vermelho-preto |
Sim (por chave) |
Pela chave O (log n) |
O Fast (log n) |
O Fast (log n) |
Não |
Multimap vermelho-preto |
Sim (por chave) |
Pela chave O(log n) (vários valores de chaves por) |
O Fast (log n) |
O Fast (log n) |
Sim (vários valores de chaves por) |
Usando objetos CTraits
sistema autônomo sistema autônomo classes de coleção ATL podem ser usadas para armazenar uma grande variedade de tipos de dados definidos pelo usuário, pode ser útil poder substituir funções importantes, sistema autônomo comparações.Isso é feito usando as classes CTraits.
Classes CTraits estão semelhante, mas mais flexível do que as funções do auxiliar de classe do MFC coleção; consulte Coleção classe auxiliares Para obter mais informações.
Ao construir sua classe de coleção, você tem a opção de especificar uma classe CTraits.Essa classe conterá o código que irá executar operações sistema autônomo comparações quando chamado por outros métodos que formam a classe de coleção.Por exemplo, se o objeto da lista contém suas próprias estruturas definidas pelo usuário, convém redefinir o teste de igualdade para comparar somente determinadas variáveis membro.Dessa forma, Find método a lista do objeto 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 obter uma lista das classes CTraits, consulte Classes de coleção.
O diagrama a seguir mostra a hierarquia de classes para as classes CTraits.
Exemplos de classes de coleção
Os exemplos a seguir demonstram as classes de coleção: