Menu
Coddy logo textTech

Проверка наличия ключей

Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 26 из 56.

Хотя оператор квадратных скобок удобен для доступа к значениям карты (map), существует потенциальная проблема: что произойдет, если вы попытаетесь обратиться к ключу, которого не существует? Как вы узнали из предыдущего урока, использование [] с несуществующим ключом автоматически создает этот ключ со значением по умолчанию.

Иногда вам нужно проверить, существует ли ключ, прежде чем обращаться к нему, чтобы случайно не создать новые записи. В таких случаях метод .count() становится полезным. Он сообщает, присутствует ли определенный ключ в карте.

Метод .count() возвращает 1, если ключ существует, и 0, если нет:

std::map<std::string, int> scores;
scores["Alice"] = 95;

if (scores.count("Alice")) {
    std::cout << "Alice's score: " << scores["Alice"] << std::endl;
} else {
    std::cout << "Alice not found" << std::endl;
}

Этот подход позволяет безопасно проверять наличие ключа и соответствующим образом обрабатывать оба случая, предотвращая создание нежелательных записей в вашей коллекции map.

challenge icon

Задание

Легко

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

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

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

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

  1. Создать std::map<std::string, int> с именем library
  2. Считать количество книг и заполнить карту названиями книг и количеством их доступных экземпляров
  3. Считать количество запросов на книги
  4. Для каждого запроса использовать метод .count(), чтобы проверить, существует ли книга в библиотеке
  5. Вывести соответствующее сообщение в зависимости от того, найдена книга или нет

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

Для каждого запроса книги:

  • Если книга существует: Book "[book title]" is available with [number] copies
  • Если книга не существует: Book "[book title]" is not available in the library

Используйте метод .count() в операторе if для проверки существования книги перед обращением к её значению. Если library.count(bookTitle) возвращает 1, книга существует, и вы можете безопасно обратиться к library[bookTitle], чтобы получить количество экземпляров. Если метод возвращает 0, книги в библиотеке нет.

Шпаргалка

Метод .count() проверяет, существует ли ключ в ассоциативном массиве (map), не создавая новых записей. Он возвращает 1, если ключ существует, и 0, если нет:

std::map<std::string, int> scores;
scores["Alice"] = 95;

if (scores.count("Alice")) {
    std::cout << "Alice's score: " << scores["Alice"] << std::endl;
} else {
    std::cout << "Alice not found" << std::endl;
}

Это предотвращает случайное создание нежелательных записей при проверке существования ключа, в отличие от использования оператора квадратных скобок [], который автоматически создает ключи со значениями по умолчанию.

Попробуйте сами

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main() {
    // Считать количество книг
    int n;
    cin >> n;
    
    // Создать карту библиотеки
    map<string, int> library;
    
    // Считать информацию о книгах и заполнить карту
    for (int i = 0; i < n; i++) {
        string title;
        int copies;
        cin >> title >> copies;
        library[title] = copies;
    }
    
    // Считать количество запросов на книги
    int m;
    cin >> m;
    
    // TODO: Напишите свой код ниже
    // Обработать каждый запрос на книгу, используя метод .count()
    // Проверить, существует ли книга, и вывести соответствующее сообщение
    
    return 0;
}
quiz iconПроверьте себя

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

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