ペアの削除
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部。レッスン 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 には Alice と Carol の scores だけが含まれます。map に存在しないキーを消去しようとしても、その操作は単に何もせず、エラーは発生しません。
map を range-based for loop で反復処理すると、各要素はキーと値を含む std::pair です。キーには .first で、値には .second でアクセスできます:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}std::map はキーを自動的にソートして保持するため、これにより各名前とスコアがアルファベット順に出力されます。
このメソッドは、データ構造を整理された状態に保ったり、古い情報を削除したり、ユーザーがアプリケーションからエントリを削除できる機能を実装したりする場合に特に役立ちます。
チャレンジ
簡単std::mapを使用してcontact directoryを管理するプログラムを作成してください。このプログラムでは、contactの名前とphone numberを保存し、その後、.erase() methodを使用してdirectoryから特定のcontactを削除できるようにします。
次の入力が与えられます:
- initial contactのnumberを表す整数
n - 続いて、
n個の入力pair:- contact nameを表すstring
- phone numberを表すstring
- 削除するcontactのnumberを表す整数
m - 続いて、削除するcontact nameを表す
m個のstring
プログラムでは次の処理を行ってください:
contactsという名前のstd::map<std::string, std::string>をCreateする- initial contactのnumberをReadし、contact nameとphone numberを使ってmapを設定する
- 以下に示す形式でInitial contact directoryをPrintする
- 削除するcontactのnumberをReadする
- 削除する各contact nameについて、
.erase()methodを使用してmapから削除する - すべての削除が完了した後、Updated contact directoryをPrintする
次の正確な出力形式を使用してください:
Initial directory:
Initial Contact Directory:
[contact1]: [phone1]
[contact2]: [phone2]
[contact3]: [phone3]
...削除後のUpdated directory:
Updated Contact Directory:
[remaining_contact1]: [phone1]
[remaining_contact2]: [phone2]
...すべての削除後にdirectoryがemptyになった場合は、次をPrintしてください:
Updated Contact Directory:
Directory is emptycontactは、mapを反復処理したときに現れる順序(contact nameのアルファベット順)でPrintしてください。range-based for loopを使用して、mapを両方の場面で反復処理し、各key-value pairにはpair.firstでcontact nameに、pair.secondでphone numberにアクセスしてください。存在しないcontactをeraseしようとしてもエラーは発生せず、mapはそのまま変更されないことに注意してください。
自分で試してみよう
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Read number of initial contacts
int n;
cin >> n;
// 連絡先のマップを作成する
map<string, string> contacts;
// Read initial 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: Print remaining contacts or "Directory is empty" if empty
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理と制御フローのすべてのレッスン
自分で練習してみよう: C++オンラインコンパイラ