Mapa em C++ Biblioteca de modelos padrão (STL)

⚡ Resumo Inteligente

Mapa em C++ É um contêiner associativo da Biblioteca de Modelos Padrão que armazena elementos como pares chave-valor ordenados, onde cada chave exclusiva corresponde a um valor e permite pesquisa, inserção e percurso ordenado rápidos.

  • 🗺️ Contêiner associativo: A C++ O mapa armazena itens como pares de chave-valor com chaves únicas e classificadas automaticamente.
  • 🧩 Cabeçalho e sintaxe: Inclua o cabeçalho do mapa e, em seguida, declare std::map. Nome para armazenar pares tipados.
  • 🛠️ Funções incorporadas: begin(), size(), empty(), insert(), find(), erase() e clear() gerenciam o conteúdo do mapa.
  • 🔄 Iteração: Um iterador bidirecional percorre os elementos do mapa em ordem alfabética para leitura ou exclusão.
  • 🔑 Chaves únicas: Dois elementos não podem compartilhar uma chave, o que torna um mapa ideal como um array associativo.
  • 🤖 Assistência de IA: O GitHub Copilot e assistentes de IA semelhantes criam declarações de mapas e loops a partir de um breve comentário.

Mapa em C++ STL

O que é o mapa C++?

In C++Um mapa (MAP) é um contêiner associativo que armazena itens em formato mapeado. Cada item no mapa é composto por um valor-chave e um valor mapeado. Dois valores mapeados não podem compartilhar os mesmos valores-chave.

Os valores-chave são úteis para classificar e identificar elementos de forma única, enquanto os valores mapeados armazenam o conteúdo associado a cada chave. Os dois podem diferir em tipo, mas o tipo de membro os combina em um par que contém ambos.

Antes de escrever qualquer código, é útil saber por que um mapa costuma ser o contêiner mais adequado.

Por que usar std::map?

Eis alguns motivos para usar um mapa:

  • std::map armazena apenas chaves únicas, em ordem classificada com base nos critérios de classificação escolhidos.
  • É fácil e rápido pesquisar elementos usando a chave.
  • Apenas um elemento é anexado a cada chave.
  • std::map pode ser usado como um array associativo.
  • std::map pode ser implementado usando árvores binárias balanceadas.

Para usufruir desses benefícios, comece pela sintaxe de declaração.

Sintaxe

Para declarar std::map, use esta sintaxe:

std::map<key_datatype, value_datatype>map_name; 
  • O tipo_de_dados_chave denota o tipo de dados das chaves do mapa.
  • O tipo_de_dados_valor denota o tipo de dados dos valores correspondentes às chaves do mapa.
  • O nome_do_mapa é o nome do mapa.

Por exemplo:

map<string, int> my_map; 

Declaramos um mapa chamado my_map. O mapa terá uma string como tipo de dado da chave e um inteiro como tipo de dado do valor.

Tipos de membros

As funções-membro podem usar os seguintes tipos de membros como parâmetros ou tipo de retorno:

  • Tipo de chave: Chave (o primeiro parâmetro no modelo)
  • tipo_mapeado: T (o segundo parâmetro no modelo)
  • chave_comparar: Compare (o terceiro parâmetro no modelo)
  • alocador_type: Alocar (o quarto parâmetro no modelo)
  • tipo_valor: par
  • valor_comparar: Classe de função aninhada para comparar elementos
  • referência: alocador_type::referência
  • referência_const: alocador_type::const_reference
  • apontador: alocador_type::ponteiro
  • ponteiro_const: alocador_type::const_pointer
  • iterador: um iterador bidirecional para o value_type
  • const_iterador: um iterador bidirecional para const value_type
  • iterador_reverso: um iterador reverso
  • const_reverse_iterador: um iterador reverso constante
  • tipo_diferença: ptrdiff_t
  • Tamanho Tipo: tamanho_t

Funções integradas de std::map

std::map vem com funções integradas. Alguns deles incluem:

  • begin () – Esta função retorna o iterador para o primeiro item do mapa.
  • Tamanho() – Esta função retorna o número de itens em um mapa.
  • vazio() – Esta função retorna um valor booleano indicando se um mapa está vazio.
  • inserir(par(chave, valor)) – Esta função insere um novo par chave-valor em um mapa.
  • encontrar(val) – Esta função fornece o iterador para o elemento val se ele for encontrado. Caso contrário, retorna m.end().
  • apagar(posição do iterador) – Esta função exclui o item na posição apontada pelo iterador.
  • apagar (const g) – Esta função remove o par chave-valor g de um mapa.
  • Claro() – Esta função exclui todos os itens de um mapa.

Com as funções definidas, os exemplos a seguir as colocam em prática, começando com a iteração.

Iterando sobre elementos do mapa

Você pode iterar sobre os elementos do mapa. Basta criar um iterador e usá-lo para isso. Por exemplo:

Exemplo 1

#include <iostream>
#include <string>
#include <map> 

using namespace std;
int main() {

	map<int, string> Students;

	Students.insert(std::pair<int, string>(200, "Alice"));

	Students.insert(std::pair<int, string>(201, "John"));

	cout << "Map size is: " << Students.size() << endl;

	cout << endl << "Default map Order is: " << endl;

	for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) {

		cout << (*it).first << ": " << (*it).second << endl;
	}
}

Saída:

C++ Exemplo 1 de iteração de mapa - saída

Aqui está uma captura de tela do código:

C++ Exemplo 1 de iteração de mapa - código

Code Explicação:

  1. Inclua o arquivo de cabeçalho iostream em nosso código para usar suas funções.
  2. Inclua o arquivo de cabeçalho de string em nosso código para usar suas funções.
  3. Inclua o arquivo de cabeçalho do mapa em nosso código para usar suas funções.
  4. Inclua o namespace std em nosso código para usar suas classes sem chamá-lo.
  5. Chame a função main(). O { marca o início do corpo da função.
  6. Crie um mapa chamado Alunos onde as chaves serão números inteiros e os valores serão strings.
  7. Insira valores no mapa Alunos. Uma chave de 200 e um valor de Alice serão inseridos no mapa.
  8. Insira valores no mapa Alunos. Uma chave 201 e um valor John serão inseridos no mapa.
  9. Use a função size() para obter o tamanho do mapa chamado Students. Isso deve retornar 2.
  10. Imprima algum texto no console.
  11. Use um loop for para criar um iterador denominado iterar sobre os elementos do mapa denominado Alunos.
  12. Imprima os valores do mapa Alunos no console.
  13. Fim do corpo do loop for.
  14. Fim do corpo da função main().

Inserindo dados em std::map

Você pode inserir itens em um std::map usando a função insert(). Lembre-se de que as chaves do std::map devem ser únicas.

Primeiro, verifica se cada chave está presente no mapa. Se estiver presente, a entrada não será inserida, mas o iterador da entrada existente será retornado. Se não estiver presente, a entrada será inserida.

A função tem as seguintes variações:

  • inserir(par) – com essa variação, um par chave-valor é inserido no mapa.
  • inserir(itr_inicial, itr_final) – com essa variação, as entradas serão inseridas dentro do intervalo definido por start_itr e end_itr de outro mapa.

A função insert_or_assign() funciona da mesma forma que a função insert(), mas se a chave fornecida já existir no mapa, seu valor será modificado.

Exemplo 2

#include <map>
#include <iostream>

using namespace std;

int main() {

	map<int, int> m{ {1,3} , {2,4} , {3,5} };

	m.insert({ 5, 6 });
	m.insert({ 1, 8 });

	m.insert_or_assign(1, 6);  
	
	cout << "Key\tElement\n";
	for (auto itr = m.begin(); itr != m.end(); ++itr) {
		cout << itr->first << '\t' << itr->second << '\n';
	}
	return 0;
}

Saída:

C++ Exemplo 2 de inserção de mapa

Aqui está uma captura de tela do código:

C++ Exemplo 2 de código para inserir mapa

Code Explicação:

  1. Inclua o arquivo de cabeçalho do mapa em nosso código para usar suas funções.
  2. Inclua o arquivo de cabeçalho iostream em nosso código para usar suas funções.
  3. Inclua o namespace std em nosso código para usar suas classes sem chamá-lo.
  4. Chame a função main(). O { marca o início do corpo da função.
  5. Crie um mapa chamado m onde as chaves serão números inteiros e os valores serão números inteiros. Três entradas foram feitas no mapa.
  6. Insira uma nova entrada no mapa m. Uma chave 5 e um valor 6 serão inseridos no mapa.
  7. Tentando fazer uma entrada em uma chave já existente. Como a chave 1 já existe no mapa, o lançamento não será feito.
  8. Utilizando a função insert_or_assign() para inserir ou modificar uma entrada existente. Como a chave 1 já existe, seu valor será alterado para 6.
  9. Imprima algum texto no console. O caractere “\t” cria um espaço horizontal enquanto o caractere “\n” move o cursor do mouse para a próxima linha.
  10. Usar um para laço para criar um iterador denominado itr para iterar sobre os elementos do mapa denominado m.
  11. Imprima os valores do mapa m no console. O caractere “\t” cria um espaço horizontal entre cada chave e seu valor correspondente. Em contraste, o caractere “\n” move o cursor do mouse para a próxima linha após cada iteração.
  12. Fim do corpo do loop for.
  13. O programa deve retornar um valor após a conclusão bem-sucedida.
  14. Fim do corpo da função main().

Pesquisando em um mapa

Podemos usar a função `find()` para buscar elementos em um mapa por suas chaves. Se a chave não for encontrada, a função retorna `std::map::end`. Caso contrário, um iterador do elemento buscado será retornado.

Exemplo 3

#include <iostream>
#include <string>
#include <map> 
using namespace std;
int main() {
	map<int, string> Students;
	Students.insert(std::pair<int, string>(200, "Alice"));
	Students.insert(std::pair<int, string>(201, "John"));
	std::map<int, string>::iterator it = Students.find(201);
	if (it != Students.end()) {
		std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n';
	}
}

Saída:

C++ mapa encontrar pesquisa Exemplo 3 saída

Aqui está uma captura de tela do código:

C++ mapa encontrar pesquisa Exemplo 3 código

Code Explicação:

  1. Inclua o arquivo de cabeçalho iostream em nosso código para usar suas funções sem obter erros.
  2. Inclua o arquivo de cabeçalho de string em nosso código para usar suas funções sem obter erros.
  3. Inclua o arquivo de cabeçalho do mapa em nosso código para usar suas funções sem obter erros.
  4. Inclua o namespace std em nosso código para usar suas classes sem chamá-lo.
  5. Chame a função main(). O { marca o início do corpo da função main().
  6. Crie um mapa chamado Alunos cujas chaves serão números inteiros e strings de valores.
  7. Insira valores no mapa Alunos. Uma chave de 200 e um valor de Alice serão inseridos no mapa.
  8. Insira valores no mapa Alunos. Uma chave 201 e um valor John serão inseridos no mapa.
  9. Procure o valor associado a uma chave 201.
  10. Use uma instrução if para verificar se o valor da chave foi encontrado.
  11. Imprima o valor da chave junto com algum texto no console.
  12. Fim do corpo da instrução if.
  13. Fim do corpo da função main().

Excluindo dados de um mapa

Podemos usar a função erase() para excluir um valor de um mapa. Simplesmente criamos um iterador que aponta para o elemento a ser excluído. O iterador é então passado para a função erase().

Exemplo 4

#include <iostream>
#include <string>
#include <map>

using namespace std;
int main() {

	map<std::string, int> my_map;

	my_map.insert(std::make_pair("cow", 1));

	my_map.insert(std::make_pair("cat", 2));

	my_map["lion"] = 3;

	map<std::string, int>::iterator it = my_map.find("cat");

	my_map.erase(it);

	for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it)

		cout << (*it).first << ": " << (*it).second << endl;

  return 0;
}

Saída:

C++ mapear apagar excluir Exemplo 4 saída

Aqui está uma captura de tela do código:

C++ mapear apagar excluir Exemplo 4 código

Code Explicação:

  1. Inclua o arquivo de cabeçalho iostream em nosso código para usar suas funções.
  2. Inclua o arquivo de cabeçalho de string em nosso código para usar suas funções.
  3. Inclua o arquivo de cabeçalho do mapa em nosso código para usar suas funções.
  4. Inclua o namespace std em nosso código para usar suas classes sem chamá-lo.
  5. Chame a função main(). O { marca o início do corpo da função main().
  6. Crie um mapa chamado my_map cujas chaves serão strings e valores inteiros.
  7. Insira valores no mapa my_map. Uma chave Cow e um valor 1 serão inseridos no mapa.
  8. Insira valores no mapa my_map. Uma chave Cat e um valor 2 serão inseridos no mapa.
  9. Adicione um valor 3 ao mapa my_map com a chave de um leão.
  10. Crie um iterador para iterar no mapa my_map procurando a chave cat.
  11. Exclua o elemento apontado pelo iterador.
  12. Utilize um iterador para percorrer os elementos do mapa `my_map` do início ao fim.
  13. Imprima o conteúdo do mapa my_map no console.
  14. O programa deve retornar a saída após a conclusão bem-sucedida.
  15. Fim do corpo da função main().

Perguntas Frequentes

std::map mantém as chaves ordenadas usando uma árvore de busca binária auto-balanceada, resultando em O(log n) operações. std::unordered_map usa uma tabela hash para buscas em média O(1), mas armazena as chaves sem nenhuma ordem específica. Escolha com base nas suas necessidades de ordenação.

Um std::map é tipicamente implementado como uma árvore binária de busca auto-balanceada, na maioria das vezes uma árvore rubro-negra. Isso mantém as chaves em ordem classificada e garante tempo logarítmico para operações de inserção, exclusão e busca.

Não. Um `std::map` armazena apenas chaves únicas, portanto, inserir uma chave existente não a sobrescreve. Quando chaves duplicadas são necessárias, use `std::multimap`, que permite que vários elementos compartilhem o mesmo valor de chave.

Use `map_name[key]` para ler ou atribuir um valor; o operador de subscrito insere uma entrada padrão se a chave estiver ausente. O membro `at()` lança uma exceção para chaves ausentes, tornando-o uma escolha mais segura.

Passe um comparador personalizado como terceiro argumento do modelo, como std::map. O comparador "maior" ordena as chaves da mais alta para a mais baixa, em vez da ordem crescente padrão.

Um `std::map` armazena pares chave-valor e busca valores pela chave, enquanto um `std::set` armazena apenas chaves únicas sem valor associado. Ambos mantêm os elementos ordenados, mas um mapa associa dados a cada chave.

Sim. Os assistentes de codificação por IA transformam um pequeno comando ou comentário em código std::map funcional, incluindo declarações, chamadas de inserção e loops de iteradores. Sempre revise os tipos de chave gerados, a ordem e os casos extremos antes de compilar.

Sim. Travas deslizantes portáteis Copiloto do GitHub Sugere declarações de mapas, chamadas de inserção e busca, e loops de iteração conforme você digita. Lida bem com código repetitivo, embora você ainda deva verificar a unicidade das chaves e a lógica antes de compilar.

Resuma esta postagem com: