删除键值对
本课属于 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 会自动对键进行排序。
这种方法在维护整洁的数据结构、删除过时信息,或实现允许用户从应用程序中删除条目的功能时特别有用。
挑战
简单使用 std::map 创建一个管理联系人目录的程序。你的程序会存储联系人姓名和电话号码,然后允许用户使用 .erase() 方法从目录中删除指定联系人。
将提供以下输入:
- 一个整数
n,表示初始联系人的数量 - 接下来是
n对输入:- 一个表示联系人姓名的字符串
- 一个表示电话号码的字符串
- 一个整数
m,表示要删除的联系人数 - 接下来是
m个表示要删除的联系人姓名的字符串
你的程序应当:
- 创建一个名为
contacts的std::map<std::string, std::string> - 读取初始联系人的数量,并将联系人姓名和电话号码添加到映射中
- 按照下方所示的格式打印初始联系人目录
- 读取要删除的联系人数
- 对于每个要删除的联系人姓名,使用
.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 循环遍历映射两次,并使用 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;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C++ 在线编译器