Acessando e Modificando Valores
Parte da seção Lógica & Fluxo do Journey de C++ da Coddy — lição 25 de 56.
Uma vez que você tenha um mapa com pares chave-valor, você frequentemente precisará recuperar ou atualizar os valores armazenados nele. O operador de colchetes [] fornece uma maneira conveniente de acessar valores existentes e modificá-los.
Para acessar um valor, basta usar a chave dentro de colchetes:
std::map<std::string, int> scores;
scores["Alice"] = 95;
int aliceScore = scores["Alice"]; // Obtém 95A mesma sintaxe funciona para atualizar valores existentes:
scores["Alice"] = 98; // Atualiza a pontuação da Alice para 98Aqui está um comportamento importante a ser lembrado: se você usar o operador [] com uma chave que não existe no mapa, ele cria automaticamente um novo elemento com essa chave e o inicializa com um valor padrão (0 para inteiros, string vazia para strings, etc.).
int bobScore = scores["Bob"]; // Cria "Bob" com o valor 0Este recurso de criação automática torna o operador [] muito conveniente tanto para a leitura quanto para a escrita de dados de mapa, pois você não precisa verificar se uma chave existe antes de usá-la.
Você também pode iterar por todos os pares chave-valor em um mapa usando um loop for baseado em intervalo. Cada elemento no mapa é um par, onde pair.first contém a chave e pair.second contém o valor:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Isso imprimirá cada par chave-valor armazenado no mapa, um por linha.
Desafio
FácilCrie um programa que gerencie um sistema de inventário de produtos usando um std::map. Seu programa rastreará nomes de produtos e suas quantidades atuais em estoque, permitindo que você acesse e atualize os níveis de inventário.
As seguintes entradas serão fornecidas:
- Um número inteiro
nrepresentando a quantidade de produtos iniciais - Em seguida,
npares de entradas:- Uma string representando o nome do produto
- Um número inteiro representando a quantidade inicial em estoque
- Uma string representando o nome de um produto para atualizar
- Um número inteiro representando a nova quantidade em estoque para esse produto
Seu programa deve:
- Criar um
std::map<std::string, int>chamadoinventory - Ler o número de produtos iniciais
- Para cada produto, ler o nome e a quantidade em estoque, e então adicioná-los ao mapa usando a notação de colchetes
- Imprimir o inventário inicial no formato mostrado abaixo
- Ler o nome do produto e a nova quantidade para atualizar
- Usar o operador de colchetes para atualizar a quantidade em estoque do produto especificado
- Imprimir o inventário atualizado mostrando o nível de estoque modificado
Use o seguinte formato de saída exato:
Initial Inventory:
[product1]: [quantity1]
[product2]: [quantity2]
[product3]: [quantity3]
...
Updated Inventory:
[product1]: [quantity1]
[product2]: [updated_quantity2]
[product3]: [quantity3]
...Os produtos devem ser impressos na ordem em que aparecem ao iterar pelo mapa (ordem alfabética pelo nome do produto). Use um loop for baseado em intervalo (range-based for loop) para iterar pelo mapa em ambas as vezes, acessando cada par chave-valor com pair.first para o nome do produto e pair.second para a quantidade. Se o nome do produto a ser atualizado não existir no mapa, o operador de colchetes criará automaticamente uma nova entrada com esse nome e a quantidade especificada.
Folha de consulta
Use o operador de colchetes [] para acessar e modificar valores de um mapa:
std::map<std::string, int> scores;
scores["Alice"] = 95; // Set value
int aliceScore = scores["Alice"]; // Get value
scores["Alice"] = 98; // Update valueSe você usar [] com uma chave que não existe, ele cria automaticamente um novo elemento com um valor padrão:
int bobScore = scores["Bob"]; // Creates "Bob" with value 0Use um loop for baseado em intervalo (range-based) para iterar por todos os pares chave-valor. Cada par possui .first para a chave e .second para o valor:
for (auto pair : scores) {
// pair.first = key (e.g. "Alice")
// pair.second = value (e.g. 98)
}Experimente você mesmo
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Ler o número de produtos iniciais
int n;
cin >> n;
// Criar o mapa de inventário
map<string, int> inventory;
// Ler produtos iniciais e quantidades
for (int i = 0; i < n; i++) {
string product;
int quantity;
cin >> product >> quantity;
// TODO: Adicionar o produto ao mapa de inventário
}
// TODO: Imprimir o inventário inicial
// Ler produto para atualizar e nova quantidade
string updateProduct;
int newQuantity;
cin >> updateProduct >> newQuantity;
// TODO: Atualizar a quantidade do produto no mapa
// TODO: Imprimir o inventário atualizado
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Ponteiros e Memória
O que é um Ponteiro?Operador de EndereçoOperador de DesreferenciaçãoPonteiros NulosPonteiros e ArraysMemória Dinâmica com 'new'Liberando Memória com 'delete'Recapitulação - Prática com Ponteiros4Mapas (Pares Chave-Valor)
Introdução ao std::mapCriando um MapaAcessando e Modificando ValoresVerificando ChavesRemovendo ParesIterando sobre um MapaRecapitulação - Frequência de Palavras2Vetores (Arrays Dinâmicos)
Introdução ao std::vectorCriando um VetorAdicionando ElementosAcessando ElementosTamanho do VetorIterando com um Loop ForLoop For Baseado em IntervaloRemovendo ElementosRecapitulação - Operações com Vetores3Projeto: Ferramenta de Lista de Tarefas
Visão Geral do ProjetoAdicionando uma Tarefa