0Pricing
C++ Academy · レッスン

std::map

順序付きのキーと値の格納

「std::map」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

std::mapとは

std::mapはキーでソートされたキーと値のペアを格納します。各キーは一意で、検索、挿入、削除は対数時間で実行されます。

  • キーはソート順に保持されます。
  • 平衡二分探索木を基にしています。
#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> ages;
    ages["Alice"] = 30;
    ages["Bob"] = 25;
    std::cout << "Alice is " << ages["Alice"] << '\n';
    return 0;
}

要素の挿入

operator[]、insert()、またはemplace()で挿入できます。存在しないキーに[]を使用すると、そのキーがデフォルト値で作成されます。

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m;
    m["one"] = 1;
    m.insert({"two", 2});
    m.emplace("three", 3);
    std::cout << m.size() << " entries\n";
    return 0;
}

ソート順での反復処理

std::mapを反復処理すると、キーが昇順に処理されます。各要素は.first(キー)と.second(値)を持つstd::pairです。

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"banana", 3}, {"apple", 5}, {"cherry", 1}};
    for (const auto& p : m) {
        std::cout << p.first << " = " << p.second << '\n';
    }
    return 0;
}

キーの検索

キーを安全に検索するにはfind()を使用してください。要素を指すイテレーターを返し、見つからない場合はend()を返します。

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"x", 10}, {"y", 20}};
    auto it = m.find("y");
    if (it != m.end()) {
        std::cout << "Found y = " << it->second << '\n';
    } else {
        std::cout << "Not found\n";
    }
    return 0;
}

存在確認

キーを作成せずに存在を確認するには、count()(0または1を返します)を使用するか、C++20のcontains()を使用してください。

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"a", 1}};
    std::cout << m.count("a") << '\n';
    std::cout << m.count("z") << '\n';
    return 0;
}

値の更新

キーに値を再代入すると、その値がその場で更新されます。mapはキーごとに1つの値だけを保持します。

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> score;
    score["player"] = 10;
    score["player"] += 5;
    std::cout << score["player"] << '\n';
    return 0;
}

要素の削除

erase()はキーまたはイテレーターで要素を削除します。キーを指定した場合は、削除した要素の数を返します。

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
    m.erase("b");
    std::cout << m.size() << " left\n";
    for (const auto& p : m) std::cout << p.first << ' ';
    std::cout << '\n';
    return 0;
}

at()の使用

at()はキーに対応する値への参照を返し、キーが存在しない場合はstd::out_of_rangeをスローします。[]とは異なり、要素を挿入することはありません。

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"k", 42}};
    std::cout << m.at("k") << '\n';
    std::cout << "size: " << m.size() << '\n';
    return 0;
}

単語の出現頻度を数える

std::mapの典型的な用途は出現回数のカウントです。[]演算子は新しいキーを0でデフォルト初期化するため、++をそのまま使用できます。

#include <iostream>
#include <map>
#include <string>

int main() {
    std::string words[] = {"cat", "dog", "cat", "bird", "dog", "cat"};
    std::map<std::string, int> freq;
    for (const auto& w : words) freq[w]++;
    for (const auto& p : freq) std::cout << p.first << ": " << p.second << '\n';
    return 0;
}

構造化束縛

C++17では構造化束縛を使って各ペアを展開し、キーと値に読みやすい名前を付けられます。

#include <iostream>
#include <map>

int main() {
    std::map<std::string, int> m{{"red", 1}, {"green", 2}};
    for (const auto& [name, value] : m) {
        std::cout << name << " -> " << value << '\n';
    }
    return 0;
}

空かどうかを確認

empty()はmapに要素がないかどうかを示し、clear()はすべての要素を一度に削除します。

#include <iostream>
#include <map>

int main() {
    std::map<int, int> m{{1, 1}, {2, 4}};
    std::cout << std::boolalpha << m.empty() << '\n';
    m.clear();
    std::cout << m.empty() << '\n';
    return 0;
}

理解度チェック

std::mapの順序付けについての理解度を確認してください。

まとめ

std::mapについて学びました。

  • 値に対応付けられた一意でソートされたキーを格納します。
  • insert、[]、find、count、at、eraseに対応しています。
  • キーの昇順で反復処理でき、構造化束縛でペアを展開できます。

次は、ソートされた一意の値だけを格納するstd::setを見ていきます。

よくある質問

「std::map」レッスンは無料ですか?

はい。「std::map」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「std::map」で何を学びますか?

順序付きのキーと値の格納 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「std::map」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. std::map
  2. std::set
  3. multimapとmultiset
  4. カスタム比較関数
← C++ Academyに戻る