Доступ и изменение значений
Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 25 из 56.
Как только у вас появится карта с парами «ключ-значение», вам часто будет требоваться извлекать или обновлять хранящиеся в ней значения. Оператор квадратных скобок [] предоставляет удобный способ как для доступа к существующим значениям, так и для их изменения.
Чтобы получить доступ к значению, просто используйте ключ внутри квадратных скобок:
std::map<std::string, int> scores;
scores["Alice"] = 95;
int aliceScore = scores["Alice"]; // Получает 95Тот же синтаксис работает для обновления существующих значений:
scores["Alice"] = 98; // Обновляет счет Алисы до 98Вот важное поведение, о котором следует помнить: если вы используете оператор [] с ключом, которого нет в карте, он автоматически создает новый элемент с этим ключом и инициализирует его значением по умолчанию (0 для целых чисел, пустая строка для строк и т. д.).
int bobScore = scores["Bob"]; // Создает "Bob" со значением 0Эта функция автоматического создания делает оператор [] очень удобным как для чтения, так и для записи данных карты, так как вам не нужно проверять существование ключа перед его использованием.
Вы также можете перебирать все пары ключ-значение в map, используя цикл for на основе диапазона (range-based). Каждый элемент в map представляет собой пару (pair), где pair.first содержит ключ, а pair.second — значение:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Это выведет каждую пару ключ-значение, хранящуюся в map, по одной на строку.
Задание
ЛегкоСоздайте программу, которая управляет системой инвентаризации товаров с использованием std::map. Ваша программа будет отслеживать названия товаров и их текущее количество на складе, позволяя вам получать доступ к уровням запасов и обновлять их.
Будут предоставлены следующие входные данные:
- Целое число
n, представляющее количество начальных товаров - Затем
nпар входных данных:- Строка, представляющая название товара
- Целое число, представляющее начальное количество на складе
- Строка, представляющая название товара для обновления
- Целое число, представляющее новое количество на складе для этого товара
Ваша программа должна:
- Создать
std::map<std::string, int>с именемinventory - Прочитать количество начальных товаров
- Для каждого товара прочитать название и количество на складе, затем добавить их в карту, используя нотацию с квадратными скобками
- Вывести начальный инвентарь в формате, показанном ниже
- Прочитать название товара и новое количество для обновления
- Использовать оператор квадратных скобок для обновления количества на складе для указанного товара
- Вывести обновленный инвентарь, показывающий измененный уровень запасов
Используйте следующий точный формат вывода:
Initial Inventory:
[product1]: [quantity1]
[product2]: [quantity2]
[product3]: [quantity3]
...
Updated Inventory:
[product1]: [quantity1]
[product2]: [updated_quantity2]
[product3]: [quantity3]
...Товары должны выводиться в том порядке, в котором они появляются при итерации по карте (в алфавитном порядке по названию товара). Используйте цикл for на основе диапазона (range-based for loop) для итерации по карте в обоих случаях, обращаясь к каждой паре ключ-значение с помощью pair.first для названия товара и pair.second для количества. Если название товара для обновления не существует в карте, оператор квадратных скобок автоматически создаст новую запись с этим именем и указанным количеством.
Шпаргалка
Используйте оператор квадратных скобок [] для доступа и изменения значений map:
std::map<std::string, int> scores;
scores["Alice"] = 95; // Установка значения
int aliceScore = scores["Alice"]; // Получение значения
scores["Alice"] = 98; // Обновление значенияЕсли вы используете [] с ключом, которого не существует, он автоматически создает новый элемент со значением по умолчанию:
int bobScore = scores["Bob"]; // Создает "Bob" со значением 0Используйте цикл for на основе диапазона (range-based), чтобы перебрать все пары ключ-значение. Каждая пара имеет .first для ключа и .second для значения:
for (auto pair : scores) {
// pair.first = ключ (например, "Alice")
// pair.second = значение (например, 98)
}Попробуйте сами
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Считать количество начальных товаров
int n;
cin >> n;
// Создать карту инвентаря
map<string, int> inventory;
// Считать начальные товары и их количество
for (int i = 0; i < n; i++) {
string product;
int quantity;
cin >> product >> quantity;
// TODO: Добавить товар в карту инвентаря
}
// TODO: Вывести начальный инвентарь
// Считать товар для обновления и новое количество
string updateProduct;
int newQuantity;
cin >> updateProduct >> newQuantity;
// TODO: Обновить количество товара в карте
// TODO: Вывести обновленный инвентарь
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями4Словари (пары ключ-значение)
Знакомство с std::mapСоздание словаряДоступ и изменение значенийПроверка наличия ключейУдаление парИтерация по словарюПовторение: частота слов2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаров