Como usar o mapa não ordenado C ++

Como usar o mapa não ordenado C ++
Um mapa, também conhecido como uma matriz associativa é uma lista de elementos, onde cada elemento é um par de chaves/valor. Então, cada chave corresponde a um valor. Chaves diferentes podem ter o mesmo valor, para trabalho comum. Por exemplo, as chaves podem ser uma lista de frutas e valores correspondentes, as cores dos frutos. Em C ++, o mapa é implementado como uma estrutura de dados com funções e operadores de membros. Um mapa ordenado é aquele em que os pares de elementos foram encomendados por chaves. Um mapa não ordenado é aquele em que não há ordem. Este artigo explica como usar o mapa não ordenado C ++, escrito como UNODERED_MAP. Você precisa de conhecimento em ponteiros C ++ para entender este artigo. UNODERED_MAP faz parte da biblioteca padrão C ++.

Classe e objetos

Uma classe é um conjunto de variáveis ​​e funções que funcionam juntas, onde as variáveis ​​não têm valores atribuídos a. Quando os valores são atribuídos às variáveis, a classe se torna um objeto. Valores diferentes dados à mesma classe resultam em objetos diferentes; isto é, objetos diferentes são a mesma classe com valores diferentes. Diz -se que criar um objeto de uma classe está instanciando o objeto.

O nome, UNODERED_MAP, é uma classe. Um objeto criado a partir da classe UNODEDED_MAP tem um nome escolhido por programador.

É necessária uma função que pertence a uma classe para instanciar um objeto da classe. Em C ++, essa função tem o mesmo nome que o nome da classe. Objetos criados (instanciados) da classe têm nomes diferentes dados a eles, pelo programador.

Criar um objeto da classe significa construir o objeto; também significa instantâneo.

Um programa C ++ que usa a classe UNODEDED_MAP começa com as seguintes linhas na parte superior do arquivo:

#incluir
#incluir
usando namespace std;

A primeira linha é para entrada/saída. A segunda linha é permitir que o programa use todos os recursos da classe UNODEDED_MAP. A terceira linha permite que o programa use os nomes no espaço de nome padrão.

Sobrecarregando uma função

Quando duas ou mais assinaturas de função diferentes têm o mesmo nome, esse nome é considerado sobrecarregado. Quando uma função é chamada, o número e o tipo de argumentos, determine qual função é realmente executada.

Construção/Construção de Cópia

Construção simples

Um mapa não ordenado pode ser construído e atribuído valores da seguinte forma:

UNODERED_MAP Umap;
Umap ["banana"] = "amarelo";
Umap ["uva"] = "verde";
Umap ["fig"] = "roxo";

A declaração começa com a especialização do modelo com os tipos para os pares de chave e valor. Isto é seguido pelo nome escolhido pelo programador para o mapa; Então um semicolon. O segundo segmento de código mostra como atribuir valores às suas chaves.
Construção por Initializer_list
Isso pode ser feito da seguinte forma:

UNODERED_MAP Umap ("banana", "amarelo",
"uva", "verde", "fig", "roxo");

Construção atribuindo Initializer_list
Exemplo:

UNODERED_MAP Umap = "banana", "amarelo",
"uva", "verde", "fig", "roxo";

Construção copiando outro UNODERED_MAP
Exemplo:

UNODERED_MAP Umap1 ("banana", "amarelo",
"uva", "verde", "fig", "roxo");
UNODERED_MAP UMAP2 (UMAP1);

O elemento par

O código a seguir mostra como criar e acessar o elemento par:

par pr = 'd', "mar";
cout << pr.first << '\n';
cout << pr.second << '\n';

A saída é:

d
mar

Primeiro e segundo são palavras reservadas para os dois itens no par. Os valores no par ainda podem ser alterados usando o primeiro e o segundo.

Um par é chamado, value_type no tópico do mapa não ordenado.

Acesso ao elemento não ordenado_map

MAPPED_TYPE & Operator [] (key_type && k)
Retorna o valor da chave correspondente. Exemplo:

UNODERED_MAP Umap;
Umap ["banana"] = "amarelo";
Umap ["uva"] = "verde";
Umap ["fig"] = "roxo";
const char *ret = umap ["uva"];
cout << ret <<'\n';

A saída é: "verde". Os valores podem ser atribuídos da mesma maneira - veja acima.

Capacidade não -ordered_map

size_type size () const Noexcept
Retorna o número de pares no mapa.

UNODERED_MAP Umap;
Umap ["banana"] = "amarelo";
Umap ["uva"] = "verde";
Umap ["fig"] = "roxo";
cout << umap.size() <<'\n';

A saída é 3.

bool vazio () const noexcept

Retorna 1 para verdadeiro se o mapa não tiver par e 0 para false se houver pares. Exemplo:

UNODERED_MAP Umap;
cout << umap.empty() <<'\n';

A saída é 1.

Iteradores retornando e a classe de mapa não ordenada

Um iterador é como um ponteiro, mas tem mais funcionalidade do que o ponteiro.

Begin () NoExcept

Retorna um iterador que aponta para o primeiro par do objeto de mapa, como no segmento de código a seguir:

UNODERED_MAP Umap;
Umap ["banana"] = "amarelo"; Umap ["uva"] = "verde"; Umap ["fig"] = "roxo";
UNODERED_MAP:: iterator iter = umap.começar();
par pr = *iter;
cout << pr.first << ", " << pr.second << '\n';

A saída é: fig, roxo. O mapa não é ordenado.

BEGIN () const NoExcept;

Retorna um iterador que aponta para o primeiro elemento da coleção de objetos do mapa. Quando a construção do objeto é precedida por const, a expressão "Begin () const" é executada em vez de "BEGIN ()". Sob essa condição, os elementos no objeto não podem ser modificados. É usado no código a seguir, por exemplo.

const UnODERED_MAP Umap ("banana", "amarelo",
"uva", "verde", "fig", "roxo");
UNODERED_MAP:: const_iterator iter = umap.começar();
par pr = *iter;
cout << pr.first << ", " << pr.second << '\n';

A saída é: fig, roxo. O mapa não é ordenado. Observe que const_iterator foi usado desta vez, em vez de apenas iterador, para receber o iterador devolvido.

end () noexcept

Retorna um iterador que aponta imediatamente além do último elemento do objeto de mapa.

end () const noexcept

Retorna um iterador que aponta imediatamente além do último elemento do objeto de mapa. Quando a construção do objeto do mapa é precedida pela const, a expressão "end () const" é executada em vez de "end ()".

Operações UNODERED_MAP

ITERator Find (const key_type & k)

Procura um par da chave dada no mapa. Se for encontrado, retorna o iterador. Se não for encontrado, ele retorna um iterador que aponta para o final do mapa, o que não é um par. O código a seguir mostra como usar esta função de membro:

UNODERED_MAP Umap;
umap ['a'] = 'b'; Umap ['c'] = 'd'; Umap ['e'] = 'f';
UNODERED_MAP:: iterator iter = umap.encontre ('c');
if (umap.encontre ('c') != UMAP.fim())
par pr = *iter;
cout << pr.first << ", " << pr.second << '\n';

A saída é: C, D

const_iterator find (const key_type & k) const;

Esta versão da função é chamada, se a criação do mapa não ordenado começar com const, tornando todos os elementos do mapa somente leitura.

modificadores não -ordered_map

par de inserção (value_type && obj)
Um mapa não ordenado significa que os pares não estão em nenhuma ordem. Então, o programa insere o par em qualquer lugar que ache conveniente. A função retorna, par. Se a inserção foi bem -sucedida, Bool será 1 para verdadeiro, caso contrário, seria 0 para false. Se a inserção for bem -sucedida, o iterador apontará para o elemento recém -inserido. O código a seguir ilustra o uso:

UNODERED_MAP Umap;
Umap ["banana"] = "amarelo";
Umap ["uva"] = "verde";
Umap ["fig"] = "roxo";
Umap.inserir ("cereja", "vermelho", "Strawberry", "Red");
cout << umap.size() << '\n';

A saída é: 5. Mais de um par pode ser inserido.

size_type apagar (const key_type & k)

Esta função apaga um par do UNODERED_MAP. O seguinte segmento de código ilustra:

UNODERED_MAP Umap;
Umap ["banana"] = "amarelo";
Umap ["uva"] = "verde";
Umap ["fig"] = "roxo";
int num = umap.apagar ("uva");
cout << umap.size() << '\n';

A saída é 2.
Void Swap (UNODERED_MAP &)
Dois mapas não ordenados podem ser trocados, conforme ilustrado neste segmento de código:

UNODERED_MAP Umap1 = "banana", "amarelo",
"uva", "verde", "fig", "roxo", "Strawberry", "Red";
UNODERED_MAP umap2 = "cereja", "vermelho", "limime", "verde";
Umap1.troca (UMAP2);
UNODERED_MAP:: iterator iter1 = Umap1.começar();
par pr1 = *iter1;
UNODERED_MAP:: iterator iter2 = Umap2.começar();
par pr2 = *iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';
UNODERED_MAP Umap1 = "banana", "amarelo",
"uva", "verde", "fig", "roxo", "Strawberry", "Red";
UNODERED_MAP umap2 = "cereja", "vermelho", "limime", "verde";
Umap1.troca (UMAP2);
UNODERED_MAP:: iterator iter1 = Umap1.começar();
par pr1 = *iter1;
UNODERED_MAP:: iterator iter2 = Umap2.começar();
par pr2 = *iter2;
cout << "First key and size of umap1: "<< pr1.first <<", "<< umap1.size() << '\n';
cout << "First key and size of umap2 "<< pr2.first <<", "<< umap2.size() << '\n';

A saída é:

Primeira chave e tamanho de UMAP1: Lime, 2
Primeira chave e tamanho de UMAP2 Strawberry, 4

O mapa não é ordenado. Observe que o comprimento de um mapa é aumentado, se necessário. Os tipos de dados devem ser os mesmos.

Classe e seus objetos instanciados

Um valor é para um tipo de dados, como um objeto instanciado é para uma classe. A construção de mapa não ordenada também pode aceitar uma classe como um tipo de dados. O programa a seguir ilustra o seguinte:

#incluir
#incluir
usando namespace std;
classe thecla
público:
int num;
char estático ch;
Void Func (Char Cha, Const Char *str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

Função de vazio estático (char ch)
if (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

Thecla obj1; Thecla obj2; Thecla obj3; Thecla obj4; Thecla obj5;
UNODERED_MAP Umap;
umap = "banana", obj1, "uva", obj2, "fig", obj3, "strawberry", obj4, "lime", obj5;
cout << umap.size() << '\n';
retornar 0;

A saída é: 5.

A definição de classe tem dois membros públicos de dados e duas funções de membros públicos. Na função principal (), diferentes objetos para a classe são instanciados. Um mapa não ordenado é então instanciado, onde cada par consiste no nome de uma fruta e um objeto da classe. O tamanho do mapa é exibido. O programa compila sem mensagem de aviso ou erro.

Aplicação do mapa

A matriz associa um índice para valorizar. Os pares de chave/valor existem em muitas situações na vida, que podem ser programadas. O par de chaves/valor de frutas/cor é apenas um exemplo. Outro exemplo é o nome das pessoas e suas idades. Nesse caso, o par será do tipo, par. Também pode ser par. Neste último caso, a diretiva de pré-processamento será empregada. Um par de chave/valor ainda pode ser o nome dos casais. Nos países onde há poligamia, haverá diferentes esposas para um homem.

Formação de um mapa

Um mapa não é uma matriz bidimensional, com duas colunas. Um mapa funciona com uma função de hash. A chave é codificada pela função de hash, em um número inteiro de uma matriz. É essa matriz que mantém os valores. Portanto, na verdade há uma matriz com os valores, e as chaves são mapeadas para os índices da matriz, e assim as correspondências entre chaves e valores são feitas. Hashing é um tópico extenso e não é abordado neste artigo.

Conclusão

Um mapa, também conhecido como uma matriz associativa é uma lista de elementos, onde cada elemento é um par de chaves/valor. Então, cada chave corresponde a um valor. Em C ++, o mapa é implementado como uma estrutura de dados com funções e operadores de membros. Um mapa ordenado é aquele em que os pares de elementos foram encomendados por chaves. Um mapa não ordenado é aquele em que não há pedidos.

Tecnicamente, um hash consiste em elementos de pares. De fato, o par é uma estrutura de dados inteira com suas funções e operadores membros. Os dois parâmetros de modelo para o par são os mesmos dois parâmetros de modelo para o UNODERED_MAP.

O inicializer_list para o mapa é uma matriz literal de literais. Cada literal interno consiste em dois objetos, o par de chaves/valores.

As funções e operadores de membros para UNODERED_MAP podem ser categorizados nos seguintes títulos: Construção/construção de cópia não -ordered_map, capacidade não -ordered_map, iterador não -ordered_map, operações não -ordered_map e modificadores não -ordered_map.

Um mapa não ordenado é usado quando uma chave deve ser mapeada para um valor.