Удаление пар
Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 27 из 56.
Иногда вам нужно удалять пары «ключ-значение» из вашей карты, когда они больше не нужны. Метод .erase() предоставляет простой способ удаления элементов путем указания ключа, который вы хотите удалить.
Чтобы удалить элемент из map, просто вызовите .erase() с ключом в качестве аргумента:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
scores.erase("Bob"); // Полностью удаляет запись BobПосле вызова erase("Bob") карта будет содержать только оценки Алисы и Кэрол. Если вы попытаетесь удалить ключ, которого нет в карте, операция просто ничего не сделает — ошибка не возникнет.
Этот метод особенно полезен для поддержания чистоты структур данных, удаления устаревшей информации или реализации функций, позволяющих пользователям удалять записи из вашего приложения.
Задание
ЛегкоСоздайте программу, которая управляет справочником контактов с использованием std::map. Ваша программа будет хранить имена контактов и номера телефонов, а затем позволит пользователям удалять определенные контакты из справочника с помощью метода .erase().
Будут предоставлены следующие входные данные:
- Целое число
n, представляющее количество начальных контактов - Затем
nпар входных данных:- Строка, представляющая имя контакта
- Строка, представляющая номер телефона
- Целое число
m, представляющее количество контактов для удаления - Затем
mстрок, представляющих имена контактов для удаления
Ваша программа должна:
- Создать
std::map<std::string, std::string>с именемcontacts - Прочитать количество начальных контактов и заполнить карту именами контактов и номерами телефонов
- Вывести начальный справочник контактов в формате, указанном ниже
- Прочитать количество контактов для удаления
- Для каждого имени контакта, который нужно удалить, использовать метод
.erase(), чтобы удалить его из карты - Вывести обновленный справочник контактов после всех удалений
Используйте следующий точный формат вывода:
Начальный справочник:
Initial Contact Directory:
[contact1]: [phone1]
[contact2]: [phone2]
[contact3]: [phone3]
...Обновленный справочник после удалений:
Updated Contact Directory:
[remaining_contact1]: [phone1]
[remaining_contact2]: [phone2]
...Если после всех удалений справочник станет пустым, выведите:
Updated Contact Directory:
Directory is emptyКонтакты должны выводиться в том порядке, в котором они появляются при итерации по карте (в алфавитном порядке по имени контакта). Используйте цикл for на основе диапазона (range-based for loop) для итерации по карте в обоих случаях, обращаясь к каждой паре ключ-значение с помощью pair.first для имени контакта и pair.second для номера телефона. Помните, что попытка удалить несуществующий контакт не вызовет ошибки — карта просто останется без изменений.
Шпаргалка
Чтобы удалить элементы из map, используйте метод .erase() с ключом:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores.erase("Bob"); // Полностью удаляет запись БобаЕсли ключ не существует, .erase() ничего не делает, и ошибка не возникает.
Попробуйте сами
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Считать количество начальных контактов
int n;
cin >> n;
// Создать карту контактов
map<string, string> contacts;
// Считать начальные контакты
for (int i = 0; i < n; i++) {
string name, phone;
cin >> name >> phone;
// TODO: Добавить контакт в карту
}
// Вывести начальный справочник
cout << "Initial Contact Directory:" << endl;
// TODO: Вывести все контакты, используя цикл for на основе диапазона
// Считать количество контактов для удаления
int m;
cin >> m;
// Удалить контакты
for (int i = 0; i < m; i++) {
string nameToRemove;
cin >> nameToRemove;
// TODO: Удалить контакт, используя метод .erase()
}
// Вывести обновленный справочник
cout << "Updated Contact Directory:" << endl;
// TODO: Вывести оставшиеся контакты или "Directory is empty", если справочник пуст
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями4Словари (пары ключ-значение)
Знакомство с std::mapСоздание словаряДоступ и изменение значенийПроверка наличия ключейУдаление парИтерация по словарюПовторение: частота слов2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаров