Menu
Coddy logo textTech

Удаление пар

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

challenge icon

Задание

Легко

Создай программу, которая управляет contact directory с помощью std::map. Твоя программа будет хранить имена contacts и номера телефонов, а затем позволит пользователям удалять определённые contacts из directory с помощью метода .erase().

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

  • Целое число n, представляющее number initial contacts
  • Затем n пар входных данных:
    • Строка, представляющая имя contact
    • Строка, представляющая номер телефона
  • Целое число m, представляющее number contacts to remove
  • Затем m строк, представляющих имена contacts для удаления

Твоя программа должна:

  1. Создать std::map<std::string, std::string> с именем contacts
  2. Считать number initial contacts и заполнить map именами contacts и номерами телефонов
  3. Вывести Initial contact directory в формате, показанном ниже
  4. Считать number contacts to remove
  5. Для каждого имени contact, который нужно удалить, использовать метод .erase(), чтобы удалить его из map
  6. Вывести 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 empty

Contacts должны выводиться в порядке, в котором они появляются при переборе 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;
}
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор C++