Classe CMap
Uma classe de coleção de dicionários que mapeia chaves exclusivas para valores.
Sintaxe
template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>class CMap : public CObject
Parâmetros
KEY
Classe do objeto usado como a chave para o mapa.
ARG_KEY
Tipo de dados usado para argumentos KEY
; geralmente uma referência a KEY
.
VALUE
Classe do objeto armazenado no mapa.
ARG_VALUE
Tipo de dados usado para argumentos VALUE
; geralmente uma referência a VALUE
.
Membros
Estruturas públicas
Nome | Descrição |
---|---|
CMap::CPair |
Uma estrutura aninhada que contém um valor de chave e o valor do objeto associado. |
Construtores públicos
Nome | Descrição |
---|---|
CMap::CMap |
Constrói uma coleção que mapeia chaves para valores. |
Métodos públicos
Nome | Descrição |
---|---|
CMap::GetCount |
Retorna o número de elementos no mapa. |
CMap::GetHashTableSize |
Retorna o número de elementos na tabela de hash. |
CMap::GetNextAssoc |
Obtém o próximo elemento para iteração. |
CMap::GetSize |
Retorna o número de elementos no mapa. |
CMap::GetStartPosition |
Retorna a posição do primeiro elemento. |
CMap::InitHashTable |
Inicializa a tabela de hash e especifica seu tamanho. |
CMap::IsEmpty |
Testa a condição de mapa vazio (sem elementos). |
CMap::Lookup |
Pesquisa o valor mapeado para uma determinada chave. |
CMap::PGetFirstAssoc |
Retorna um ponteiro para o primeiro elemento. |
CMap::PGetNextAssoc |
Obtém um ponteiro para o próximo elemento para iteração. |
CMap::PLookup |
Retorna um ponteiro para uma chave cujo valor corresponde ao valor especificado. |
CMap::RemoveAll |
Remove todos os elementos desse mapa. |
CMap::RemoveKey |
Remove um elemento especificado por uma chave. |
CMap::SetAt |
Insere um elemento no mapa; substituirá um elemento se uma chave correspondente for encontrada. |
Operadores públicos
Nome | Descrição |
---|---|
CMap::operator [ ] |
Insere um elemento no mapa – substituição do operador por SetAt . |
Comentários
Depois de inserir um par chave-valor (elemento) no mapa, você poderá recuperar ou excluir com eficiência o par usando a chave para acessá-lo. Você também pode iterar por todos os elementos no mapa.
Uma variável de tipo POSITION
é usada para acesso alternativo a entradas. Você pode usar um POSITION
para "lembrar" uma entrada e iterar por meio do mapa. Você pode pensar que essa iteração é sequencial por valor de chave; ela não é. A sequência de elementos recuperados é indeterminada.
Determinadas funções membro dessa classe chamam funções auxiliares globais que precisam ser personalizadas para a maioria dos usos da classe CMap
. Confira Auxiliares de classe de coleção na seção Macros e globais da Referência do MFC.
CMap
substitui CObject::Serialize
para dar suporte para serialização e despejo de seus elementos. Se um mapa for armazenado em um arquivo morto usando Serialize
, cada elemento de mapa será serializado individualmente. A implementação padrão da função SerializeElements
auxiliar faz uma gravação bit a bit. Para informações sobre a serialização de itens de coleção de ponteiros derivados de CObject
ou de outros tipos definidos pelo usuário, confira Como tornar uma coleção fortemente tipada.
Se você precisar de um despejo de diagnóstico dos elementos individuais no mapa (as chaves e os valores), deverá definir a profundidade do contexto do despejo como 1 ou maior.
Quando um objeto CMap
é excluído ou seus elementos são removidos, as chaves e os valores são removidos.
A derivação de classe de mapa é semelhante à derivação de lista. Confira o artigo Coleções para uma ilustração da derivação de uma classe de lista de finalidade especial.
Hierarquia de herança
CMap
Requisitos
Cabeçalho: afxtempl.h
CMap::CMap
Constrói um mapa vazio.
CMap(INT_PTR nBlockSize = 10);
Parâmetros
nBlockSize
Especifica a granularidade de alocação de memória para estender o mapa.
Comentários
À medida que o mapa cresce, a memória é alocada em unidades de entradas nBlockSize
.
Exemplo
// declares a map of ints to points
CMap<int, int, CPoint, CPoint> myMap(16);
CMap::CPair
Contém um valor de chave e o valor do objeto associado.
Comentários
Essa é uma estrutura aninhada dentro da classe CMap
.
A estrutura é composta por dois campos:
key
O valor real do tipo de chave.value
O valor do objeto associado.
Ela é usada para armazenar os valores retornados de CMap::PLookup
, CMap::PGetFirstAssoc
e CMap::PGetNextAssoc
.
Exemplo
Para um exemplo de uso, confira o exemplo de CMap::PLookup
.
CMap::GetCount
Recupera o número de elementos no mapa.
INT_PTR GetCount() const;
Valor de retorno
O número de elementos.
Exemplo
Confira o exemplo de CMap::Lookup
.
CMap::GetHashTableSize
Determina o número de elementos na tabela de hash do mapa.
UINT GetHashTableSize() const;
Valor de retorno
O número de elementos na tabela de hash.
Exemplo
CMap<int, int, CPoint, CPoint> myMap;
UINT uTableSize = myMap.GetHashTableSize();
CMap::GetNextAssoc
Recupera o elemento de mapa em rNextPosition
, em seguida, atualiza rNextPosition
para se referir ao próximo elemento no mapa.
void GetNextAssoc(
POSITION& rNextPosition,
KEY& rKey,
VALUE& rValue) const;
Parâmetros
rNextPosition
Especifica uma referência a um valor POSITION
retornado por uma chamada GetNextAssoc
ou GetStartPosition
anterior.
KEY
Parâmetro de modelo que especifica o tipo da chave do mapa.
rKey
Especifica a chave retornada do elemento recuperado.
VALUE
Parâmetro de modelo que especifica o tipo do valor do mapa.
rValue
Especifica o valor retornado do elemento recuperado.
Comentários
Essa função é mais útil para iterar todos os elementos no mapa. Observe que a sequência de posição não é necessariamente a mesma que a sequência de valor de chave.
Se o elemento recuperado for o último no mapa, o novo valor de rNextPosition
será definido como NULL
.
Exemplo
Confira o exemplo de CMap::SetAt
.
CMap::GetSize
Retorna o número de elementos de mapa.
INT_PTR GetSize() const;
Valor de retorno
O número de itens no mapa.
Comentários
Chame esse método para recuperar o número de elementos no mapa.
Exemplo
CMap<int, int, CPoint, CPoint> myMap;
myMap.InitHashTable(257);
// Add 200 elements to the map.
for (int i = 0; i < 200; i++)
{
myMap[i] = CPoint(i, i);
}
// Remove the elements with even key values.
CPoint pt;
for (int i = 0; myMap.Lookup(i, pt); i += 2)
{
myMap.RemoveKey(i);
}
ASSERT(myMap.GetSize() == 100);
TRACE(_T("myMap with %d elements:\n"), myMap.GetCount());
POSITION pos = myMap.GetStartPosition();
int iKey;
CPoint ptVal;
while (pos != NULL)
{
myMap.GetNextAssoc(pos, iKey, ptVal);
TRACE(_T("\t[%d] = (%d,%d)\n"), iKey, ptVal.x, ptVal.y);
}
CMap::GetStartPosition
Inicia uma iteração de mapa retornando um valor POSITION
que pode ser passado para uma chamada GetNextAssoc
.
POSITION GetStartPosition() const;
Valor de retorno
Um valor POSITION
que indica uma posição inicial para iterar o mapa; ou NULL
se o mapa estiver vazio.
Comentários
A sequência de iteração não é previsível; portanto, o "primeiro elemento no mapa" não tem significado especial.
Exemplo
Confira o exemplo de CMap::SetAt
.
CMap::InitHashTable
Inicializa a tabela de hash.
void InitHashTable(UINT hashSize, BOOL bAllocNow = TRUE);
Parâmetros
hashSize
O número de entradas na tabela de hash.
bAllocNow
Se TRUE
, aloca a tabela de hash após a inicialização; caso contrário, a tabela é alocada quando necessário.
Comentários
Para obter o melhor desempenho, o tamanho da tabela de hash deve ser um número primo. Para minimizar colisões, o tamanho deve ser aproximadamente 20% maior do que o maior conjunto de dados previsto.
Exemplo
Confira o exemplo de CMap::Lookup
.
CMap::IsEmpty
Determina se o mapa está vazio.
BOOL IsEmpty() const;
Valor de retorno
Não zero se este mapa não contiver elementos; caso contrário, 0.
Exemplo
Confira o exemplo de CMap::RemoveAll
.
CMap::Lookup
Pesquisa o valor mapeado para uma determinada chave.
BOOL Lookup(ARG_KEY key, VALUE& rValue) const;
Parâmetros
ARG_KEY
Parâmetro de modelo que especifica o tipo do valor key
.
key
Especifica a chave que identifica o elemento a ser pesquisado.
VALUE
Especifica o tipo do valor a ser pesquisado.
rValue
Recebe o valor pesquisado.
Valor de retorno
Não zero se o elemento foi encontrado; caso contrário, 0.
Comentários
Lookup
usa um algoritmo de hash para localizar com rapidez o elemento de mapa com uma chave que corresponde exatamente à chave fornecida.
Exemplo
CMap<int, int, CPoint, CPoint> myMap;
myMap.InitHashTable(257);
// Add 200 elements to the map.
for (int i = 0; i < 200; i++)
{
myMap[i] = CPoint(i, i);
}
// Remove the elements with even key values.
CPoint pt;
for (int i = 0; myMap.Lookup(i, pt); i += 2)
{
myMap.RemoveKey(i);
}
ASSERT(myMap.GetSize() == 100);
TRACE(_T("myMap with %d elements:\n"), myMap.GetCount());
POSITION pos = myMap.GetStartPosition();
int iKey;
CPoint ptVal;
while (pos != NULL)
{
myMap.GetNextAssoc(pos, iKey, ptVal);
TRACE(_T("\t[%d] = (%d,%d)\n"), iKey, ptVal.x, ptVal.y);
}
CMap::operator [ ]
Um substituto conveniente para a função de membro SetAt
.
VALUE& operator[](arg_key key);
Parâmetros
VALUE
Parâmetro de modelo que especifica o tipo do valor do mapa.
ARG_KEY
Parâmetro de modelo que especifica o tipo do valor da chave.
key
A chave usada para recuperar o valor do mapa.
Comentários
Assim, ele só pode ser usado no lado esquerdo de uma instrução de atribuição (um l-value). Se não houver nenhum elemento de mapa com a chave especificada, um novo elemento será criado.
Não há nenhum equivalente "lado direito" (r-value) a esse operador porque há a possibilidade de que uma chave não seja encontrada no mapa. Use a função de membro Lookup
para recuperação de elemento.
Exemplo
Confira o exemplo de CMap::Lookup
.
CMap::PGetFirstAssoc
Retorna a primeira entrada do objeto de mapa.
const CPair* PGetFirstAssoc() const;
CPair* PGetFirstAssoc();
Valor de retorno
Um ponteiro para a primeira entrada no mapa; confira CMap::CPair
. Se o mapa não contiver entradas, o valor será NULL
.
Comentários
Chame essa função para retornar um ponteiro do primeiro elemento no objeto de mapa.
Exemplo
typedef CMap<int, int, CPoint, CPoint> CMyMap;
CMyMap myMap;
myMap.InitHashTable(257);
// Add 10 elements to the map.
for (int i = 0; i <= 10; i++)
myMap.SetAt(i, CPoint(i, i));
// Print the element value with even key values.
int nKey = 0;
CPoint pt;
CMyMap::CPair *pCurVal;
pCurVal = myMap.PGetFirstAssoc();
while (pCurVal != NULL)
{
if ((nKey % 2) == 0)
{
_tprintf_s(_T("Current key value at %d: %d,%d\n"),
pCurVal->key, pCurVal->value.x, pCurVal->value.y);
}
pCurVal = myMap.PGetNextAssoc(pCurVal);
nKey++;
}
CMap::PGetNextAssoc
Recupera o elemento de mapa apontado por pAssocRec
.
const CPair *PGetNextAssoc(const CPair* pAssocRet) const;
CPair *PGetNextAssoc(const CPair* pAssocRet);
Parâmetros
pAssocRet
Aponta para uma entrada de mapa retornada por uma chamada a PGetNextAssoc
ou CMap::PGetFirstAssoc
anterior.
Valor de retorno
Um ponteiro para a próxima entrada no mapa; confira CMap::CPair
. Se o elemento for o último no mapa, o valor será NULL
.
Comentários
Chame esse método para iterar todos os elementos no mapa. Recupere o primeiro elemento com uma chamada para PGetFirstAssoc
e itere pelo mapa com chamadas sucessivas para PGetNextAssoc
.
Exemplo
Confira o exemplo de CMap::PGetFirstAssoc
.
CMap::PLookup
Localiza o valor mapeado para uma determinada chave.
const CPair* PLookup(ARG_KEY key) const;
CPair* PLookup(ARG_KEY key);
Parâmetros
key
Chave para o elemento a ser pesquisado.
Valor de retorno
Um ponteiro para uma estrutura de chave; confira CMap::CPair
. Se nenhuma correspondência for encontrada, CMap::PLookup
retornará NULL
.
Comentários
Chame esse método para pesquisar um elemento de mapa com uma chave que corresponda exatamente à chave fornecida.
Exemplo
typedef CMap<int, int, CPoint, CPoint> CMyMap;
CMyMap myMap;
myMap.InitHashTable(257);
// Add 10 elements to the map.
for (int i = 0; i <= 10; i++)
myMap[i] = CPoint(i, i);
// Print the element values with even key values.
CMyMap::CPair *pCurVal;
for (int i = 0; i <= myMap.GetCount(); i += 2)
{
pCurVal = myMap.PLookup(i);
_tprintf_s(_T("Current key value at %d: %d,%d\n"),
pCurVal->key, pCurVal->value.x, pCurVal->value.y);
}
CMap::RemoveAll
Remove todos os valores desse mapa chamando a função auxiliar global DestructElements
.
void RemoveAll();
Comentários
A função funcionará corretamente se o mapa já estiver vazio.
Exemplo
CMap<int, int, CPoint, CPoint> myMap;
// Add 10 elements to the map.
for (int i = 0; i < 10; i++)
myMap.SetAt(i, CPoint(i, i));
myMap.RemoveAll();
ASSERT(myMap.IsEmpty());
CMap::RemoveKey
Pesquisa a entrada do mapa correspondente à chave fornecida; em seguida, se a chave for encontrada, removerá a entrada.
BOOL RemoveKey(ARG_KEY key);
Parâmetros
ARG_KEY
Parâmetro de modelo que especifica o tipo da chave.
key
Chave para o elemento a ser removido.
Valor de retorno
Não zero se a entrada foi encontrada e removida com êxito; caso contrário, 0.
Comentários
A função auxiliar DestructElements
é usada para remover a entrada.
Exemplo
Confira o exemplo de CMap::SetAt
.
CMap::SetAt
A primária significa inserir um elemento em um mapa.
void SetAt(ARG_KEY key, ARG_VALUE newValue);
Parâmetros
ARG_KEY
Parâmetro de modelo que especifica o tipo do parâmetro key
.
key
Especifica a chave do novo elemento.
ARG_VALUE
Parâmetro de modelo que especifica o tipo do parâmetro newValue
.
newValue
Especifica o valor do novo elemento.
Comentários
Primeiro, a chave é pesquisada. Se a chave for encontrada, o valor correspondente será alterado; caso contrário, um novo par chave-valor será criado.
Exemplo
CMap<int, int, CPoint, CPoint> myMap;
// Add 10 elements to the map.
for (int i = 0; i < 10; i++)
myMap.SetAt(i, CPoint(i, i));
// Remove the elements with even key values.
POSITION pos = myMap.GetStartPosition();
int nKey;
CPoint pt;
while (pos != NULL)
{
myMap.GetNextAssoc(pos, nKey, pt);
if ((nKey % 2) == 0)
myMap.RemoveKey(nKey);
}
// Print the element values.
pos = myMap.GetStartPosition();
while (pos != NULL)
{
myMap.GetNextAssoc(pos, nKey, pt);
_tprintf_s(_T("Current key value at %d: %d,%d\n"),
nKey, pt.x, pt.y);
}