ペアの削除
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") を呼び出した後、マップにはアリスとキャロルのスコアのみが含まれます。マップに存在しないキーを削除しようとしても、その操作は何もしません。エラーは発生しません。
範囲ベースの 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;
// 連絡先マップを作成する
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;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。