マップの反復処理
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部 — レッスン 28/56。
マップから要素を作成、変更、削除する方法を学んだので、次はマップ内のすべてのキーと値のペアを走査する方法を学びましょう。範囲ベースの for ループは、std::map 内のすべての要素を反復処理するための洗練された方法を提供します。
マップを反復処理するための基本的な構文は次のとおりです。
for (auto pair : myMap) {
// pair.first でキーにアクセスします
// pair.second で値にアクセスします
}ループ内の各要素は、2つの重要なメンバを含むpairオブジェクトです。firstはキーを保持し、secondは値を保持します。以下に具体的な例を示します:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}これは、各生徒の名前とそれに続くスコアを表示します。autoキーワードは、各ペアの正しい型を自動的に決定するため、コードがよりすっきりと読みやすくなります。
チャレンジ
簡単std::map を使用してレストランのメニューシステムを管理するプログラムを作成してください。このプログラムは、メニュー項目とその価格を保存し、すべてのキーと値のペアを反復処理してメニュー全体を表示します。
以下の入力が提供されます:
- メニュー項目の数を表す整数
n - その後、
n個の入力ペア:- 料理名を表す文字列
- 料理の価格を表す double 型の数値
プログラムは以下の手順を実行する必要があります:
menuという名前のstd::map<std::string, double>を作成する- メニュー項目の数を読み込む
- 各メニュー項目について、料理名と価格を読み込み、角括弧記法を使用してマップに追加する
- 範囲ベースの for ループを使用してマップ全体を反復処理し、各料理とその価格を表示する
- メニュー内の項目の総数を計算して表示する
以下の正確な出力形式を使用してください:
Restaurant Menu:
[dish1]: $[price1]
[dish2]: $[price2]
[dish3]: $[price3]
...
Total menu items: [number of items]メニュー項目は、マップを反復処理したときに現れる順序(料理名のアルファベット順)で表示する必要があります。マップを反復処理するには auto pair : menu を使用した範囲ベースの for ループを使用し、料理名には pair.first、価格には pair.second を使用して各キーと値のペアにアクセスします。各価格は、std::fixed と std::setprecision(2) を使用して、小数点以下ちょうど2桁で表示してください。
チートシート
範囲ベースの for ループを使用して、std::map 内のすべてのキーと値のペアを反復処理します。
for (auto pair : myMap) {
// pair.first でキーにアクセスします
// pair.second で値にアクセスします
}各要素は pair オブジェクトであり、first がキーを保持し、second が値を保持します。
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}auto キーワードは、各ペアの正しい型を自動的に決定します。
自分で試してみよう
#include <iostream>
#include <map>
#include <string>
#include <iomanip>
using namespace std;
int main() {
// メニュー項目の数を読み込む
int n;
cin >> n;
// メニューのマップを作成する
map<string, double> menu;
// メニュー項目と価格を読み込む
for (int i = 0; i < n; i++) {
string dish;
double price;
cin >> dish >> price;
// TODO: 料理と価格をメニューのマップに追加する
}
// TODO: "Restaurant Menu:" ヘッダーを出力する
// TODO: 範囲ベースのforループを使用してメニューを反復処理し、各項目を出力する
// 形式: [dish]: $[price] (小数点以下2位まで)
// TODO: メニュー項目の総数を出力する
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。