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