Проверка наличия ключей
Часть раздела Логика и управление потоком путешествия по 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.
Задание
ЛегкоСоздайте программу, которая управляет системой выдачи книг в библиотеке с использованием std::map. Ваша программа будет отслеживать, какие книги доступны, и использовать метод .count() для безопасной проверки существования книг перед попыткой доступа к информации о них.
Будут предоставлены следующие входные данные:
- Целое число
n, представляющее количество книг в библиотеке - Затем
nпар входных данных:- Строка, представляющая название книги
- Целое число, представляющее количество доступных экземпляров
- Целое число
m, представляющее количество запросов на проверку книг - Затем
mстрок, представляющих названия книг для поиска
Ваша программа должна:
- Создать
std::map<std::string, int>с именемlibrary - Считать количество книг и заполнить карту названиями книг и количеством их доступных экземпляров
- Считать количество запросов на книги
- Для каждого запроса использовать метод
.count(), чтобы проверить, существует ли книга в библиотеке - Вывести соответствующее сообщение в зависимости от того, найдена книга или нет
Используйте следующий точный формат вывода:
Для каждого запроса книги:
- Если книга существует:
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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями4Словари (пары ключ-значение)
Знакомство с std::mapСоздание словаряДоступ и изменение значенийПроверка наличия ключейУдаление парИтерация по словарюПовторение: частота слов2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаров