Menu
Coddy logo textTech

キーの存在確認

CoddyのC++ジャーニー「論理と制御フロー」セクションの一部 — レッスン 26/56。

マップの値にアクセスする際、角括弧演算子は便利ですが、潜在的な問題があります。存在しないキーにアクセスしようとするとどうなるでしょうか?前のレッスンで学んだように、存在しないキーに対して [] を使用すると、そのキーがデフォルト値で自動的に作成されます。

時には、誤って新しいエントリを作成することなく、アクセスする前にキーが存在するかどうかを確認したい場合があります。ここで .count() メソッドが役立ちます。これは、特定のキーがマップ内に存在するかどうかを教えてくれます。

.count() メソッドは、キーが存在する場合は 1 を、存在しない場合は 0 を返します。

std::map<std::string, int> scores;
scores["Alice"] = 95;

if (scores.count("Alice")) {
    std::cout << "Alice's score: " << scores["Alice"] << std::endl;
} else {
    std::cout << "Alice not found" << std::endl;
}

このアプローチにより、キーの存在を安全に確認し、両方のケースを適切に処理できるため、マップ内に不要なエントリが作成されるのを防ぐことができます。

challenge icon

チャレンジ

簡単

std::map を使用して、図書館の書籍貸出システムを管理するプログラムを作成してください。このプログラムは、どの本が利用可能かを追跡し、.count() メソッドを使用して、情報の取得を試みる前にその本が存在するかどうかを安全に確認します。

以下の入力が提供されます:

  • 図書館にある本の数を示す整数 n
  • 続いて n 組の入力:
    • 本のタイトルを表す文字列
    • 利用可能なコピー数(冊数)を表す整数
  • 確認する本の検索リクエスト数を示す整数 m
  • 続いて検索する本のタイトルを表す m 個の文字列

プログラムの要件:

  1. library という名前の std::map<std::string, int> を作成する
  2. 本の数を読み込み、本のタイトルと利用可能なコピー数をマップに格納する
  3. 本の検索リクエスト数を読み込む
  4. 各リクエストについて、.count() メソッドを使用してその本が図書館に存在するか確認する
  5. 本が見つかったかどうかに基づいて、適切なメッセージを出力する

以下の正確な出力形式を使用してください:

各本の検索リクエストに対して:

  • 本が存在する場合:Book "[book title]" is available with [number] copies
  • 本が存在しない場合:Book "[book title]" is not available in the library

値にアクセスする前に、if文の中で .count() メソッドを使用して本の存在を確認してください。library.count(bookTitle) が 1 を返す場合、その本は存在し、library[bookTitle] に安全にアクセスしてコピー数を取得できます。0 を返す場合、その本は図書館に存在しません。

チートシート

.count()メソッドは、新しいエントリを作成せずにマップ内にキーが存在するかどうかを確認します。キーが存在する場合は1を、存在しない場合は0を返します。

std::map<std::string, int> scores;
scores["Alice"] = 95;

if (scores.count("Alice")) {
    std::cout << "Alice's score: " << scores["Alice"] << std::endl;
} else {
    std::cout << "Alice not found" << std::endl;
}

これは、キーの存在を確認する際に、デフォルト値を持つキーを自動的に作成する角括弧演算子[]とは異なり、不要なエントリが誤って作成されるのを防ぎます。

自分で試してみよう

#include <iostream>
#include <map>
#include <string>
using namespace std;

int main() {
    // 本の数を読み込む
    int n;
    cin >> n;
    
    // ライブラリのマップを作成する
    map<string, int> library;
    
    // 本の情報を読み込み、マップに格納する
    for (int i = 0; i < n; i++) {
        string title;
        int copies;
        cin >> title >> copies;
        library[title] = copies;
    }
    
    // 本のリクエスト数を読み込む
    int m;
    cin >> m;
    
    // TODO: 以下にコードを記述してください
    // .count() メソッドを使用して各本の要求を処理する
    // 本が存在するかどうかを確認し、適切なメッセージを出力する
    
    return 0;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

論理と制御フローのすべてのレッスン