Menu
CoddyTech

删除键值对

本课属于 Coddy C++ 学习旅程的“逻辑与流程”单元。第 27 课,共 56 课。

有时,你需要从映射中删除不再需要的键值对。.erase() 方法可以让你通过指定要删除的键,轻松删除元素。

要从映射中删除一个元素,只需调用 .erase(),并将键作为参数:

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

scores.erase("Bob"); // 彻底删除 Bob 的条目

调用 erase("Bob") 后,映射中只会包含 Alice 和 Carol 的分数。如果你尝试删除映射中不存在的键,这个操作不会产生任何效果,也不会发生错误。

使用基于范围的 for 循环遍历映射时,每个元素都是一个包含键和值的 std::pair。你可以使用 .first 访问键,使用 .second 访问值:

for (auto pair : scores) {
    std::cout << pair.first << ": " << pair.second << std::endl;
}

这会按字母顺序打印每个姓名和分数,因为 std::map 会自动对键进行排序。

这种方法在维护整洁的数据结构、删除过时信息,或实现允许用户从应用程序中删除条目的功能时特别有用。

challenge icon

挑战

简单

使用 std::map 创建一个管理联系人目录的程序。你的程序会存储联系人姓名和电话号码,然后允许用户使用 .erase() 方法从目录中删除指定联系人。

将提供以下输入:

  • 一个整数 n,表示初始联系人的数量
  • 接下来是 n 对输入:
    • 一个表示联系人姓名的字符串
    • 一个表示电话号码的字符串
  • 一个整数 m,表示要删除的联系人数
  • 接下来是 m 个表示要删除的联系人姓名的字符串

你的程序应当:

  1. 创建一个名为 contacts 的 std::map<std::string, std::string>
  2. 读取初始联系人的数量,并将联系人姓名和电话号码添加到映射中
  3. 按照下方所示的格式打印初始联系人目录
  4. 读取要删除的联系人数
  5. 对于每个要删除的联系人姓名,使用 .erase() 方法将其从映射中删除
  6. 在完成所有删除后,打印更新后的联系人目录

使用以下确切的输出格式:

初始目录:

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 循环遍历映射两次,并使用 pair.first 访问每个键值对中的联系人姓名,使用 pair.second 访问电话号码。请记住,尝试删除不存在的联系人不会导致错误,映射只会保持不变。

亲手试试

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

int main() {
    // 读取初始联系人的数量
    int n;
    cin >> n;
    
    // 创建 contacts 映射
    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;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: C++ 在线编译器