Menu
Coddy logo textTech

Доступ и изменение значений

Часть раздела Логика и управление потоком путешествия по 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, по одной на строку.

challenge icon

Задание

Легко

Создайте программу, которая управляет системой инвентаризации товаров с использованием std::map. Ваша программа будет отслеживать названия товаров и их текущее количество на складе, позволяя вам получать доступ к уровням запасов и обновлять их.

Будут предоставлены следующие входные данные:

  • Целое число n, представляющее количество начальных товаров
  • Затем n пар входных данных:
    • Строка, представляющая название товара
    • Целое число, представляющее начальное количество на складе
  • Строка, представляющая название товара для обновления
  • Целое число, представляющее новое количество на складе для этого товара

Ваша программа должна:

  1. Создать std::map<std::string, int> с именем inventory
  2. Прочитать количество начальных товаров
  3. Для каждого товара прочитать название и количество на складе, затем добавить их в карту, используя нотацию с квадратными скобками
  4. Вывести начальный инвентарь в формате, показанном ниже
  5. Прочитать название товара и новое количество для обновления
  6. Использовать оператор квадратных скобок для обновления количества на складе для указанного товара
  7. Вывести обновленный инвентарь, показывающий измененный уровень запасов

Используйте следующий точный формат вывода:

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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком