値のアクセスと変更
CoddyのC++ジャーニー「論理と制御フロー」セクションの一部 — レッスン 25/56。
キーと値のペアを持つマップを作成したら、そこに格納されている値を取得したり更新したりする必要が頻繁に生じます。角括弧 [] 演算子は、既存の値へのアクセスと、それらの変更の両方を行うための便利な方法を提供します。
値にアクセスするには、単に角括弧の中にキーを使用します:
std::map<std::string, int> scores;
scores["Alice"] = 95;
int aliceScore = scores["Alice"]; // 95を取得します既存の値を更新する場合も、同じ構文が使えます:
scores["Alice"] = 98; // Aliceのスコアを98に更新します覚えておくべき重要な動作があります。マップ内に存在しないキーに対して [] 演算子を使用すると、そのキーを持つ新しい要素が自動的に作成され、デフォルト値(整数の場合は 0、文字列の場合は空の文字列など)で初期化されます。
int bobScore = scores["Bob"]; // 値0で"Bob"を作成しますこの自動作成機能により、使用前にキーが存在するかどうかを確認する必要がないため、[] 演算子はマップデータの読み取りと書き込みの両方において非常に便利になります。
範囲ベースの for ループを使用して、マップ内のすべてのキーと値のペアを反復処理することもできます。マップ内の各要素は pair であり、pair.first がキーを、pair.second が値を保持します:
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}これにより、マップに格納されているすべてのキーと値のペアが、1行に1つずつ出力されます。
チャレンジ
簡単std::map を使用して製品在庫システムを管理するプログラムを作成してください。このプログラムは、製品名とその現在の在庫数を追跡し、在庫レベルへのアクセスや更新を可能にします。
以下の入力が提供されます:
- 初期製品の数を示す整数
n - その後に続く
n組の入力:- 製品名を示す文字列
- 初期在庫数を示す整数
- 更新する製品名を示す文字列
- その製品の新しい在庫数を示す整数
プログラムは以下の手順を実行する必要があります:
inventoryという名前のstd::map<std::string, int>を作成する- 初期製品の数を読み込む
- 各製品について、名前と在庫数を読み込み、角括弧記法を使用してマップに追加する
- 以下に示す形式で初期在庫を表示する
- 更新する製品名と新しい数量を読み込む
- 角括弧演算子を使用して、指定された製品の在庫数を更新する
- 変更された在庫レベルを含む更新後の在庫を表示する
以下の正確な出力形式を使用してください:
Initial Inventory:
[product1]: [quantity1]
[product2]: [quantity2]
[product3]: [quantity3]
...
Updated Inventory:
[product1]: [quantity1]
[product2]: [updated_quantity2]
[product3]: [quantity3]
...製品は、マップを反復処理する際に出現する順序(製品名のアルファベット順)で表示する必要があります。両方の表示において範囲ベースの for ループを使用してマップを反復処理し、製品名には pair.first、数量には pair.second を使用して各キーと値のペアにアクセスしてください。更新対象の製品名がマップに存在しない場合、角括弧演算子は自動的にその名前と指定された数量で新しいエントリを作成します。
チートシート
角括弧 [] 演算子を使用して、マップの値にアクセスしたり変更したりします:
std::map<std::string, int> scores;
scores["Alice"] = 95; // 値を設定
int aliceScore = scores["Alice"]; // 値を取得
scores["Alice"] = 98; // 値を更新存在しないキーに対して [] を使用すると、デフォルト値を持つ新しい要素が自動的に作成されます:
int bobScore = scores["Bob"]; // 値 0 で "Bob" を作成範囲ベースの for ループを使用して、すべてのキーと値のペアを反復処理します。各ペアには、キー用の .first と値用の .second があります:
for (auto pair : scores) {
// pair.first = キー (例: "Alice")
// pair.second = 値 (例: 98)
}自分で試してみよう
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// 初期の製品数を読み込む
int n;
cin >> n;
// 在庫マップを作成する
map<string, int> inventory;
// 初期の製品と数量を読み込む
for (int i = 0; i < n; i++) {
string product;
int quantity;
cin >> product >> quantity;
// TODO: 製品を在庫マップに追加する
}
// TODO: 初期の在庫を表示する
// 更新する製品と新しい数量を読み込む
string updateProduct;
int newQuantity;
cin >> updateProduct >> newQuantity;
// TODO: マップ内の製品数量を更新する
// TODO: 更新された在庫を表示する
return 0;
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。