0Pricing
C++ Academy · レッスン

std::unordered_map

ハッシュベースの高速検索

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

unordered_map とは

std::unordered_map はキーと値のペアをハッシュテーブルに格納します。検索、挿入、削除は平均で定数時間ですが、要素にソート順はありません。

#include <iostream>
#include <unordered_map>

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

map と unordered_map の比較

必要な機能に応じて選びます。

  • map: ソートされ、操作は O(log n)
  • unordered_map: 順序付けされず、操作は平均 O(1)

高速な検索だけが必要な場合は unordered_map を使います。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<int, std::string> m{{3, "c"}, {1, "a"}, {2, "b"}};
    std::cout << m.size() << " entries (order not guaranteed)\n";
    return 0;
}

挿入と更新

map と同じ API を使います。[]、insert()、または emplace() を使用します。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m;
    m["x"] = 1;
    m.insert({"y", 2});
    m.emplace("z", 3);
    std::cout << m.size() << '\n';
    return 0;
}

find による検索

find() はイテレータまたは end() を返します。これにより、[] を使ったときのようにデフォルト値を誤って挿入することを防げます。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}};
    auto it = m.find("a");
    if (it != m.end()) std::cout << it->second << '\n';
    std::cout << "size: " << m.size() << '\n';
    return 0;
}

存在確認

count() は 0 または 1 を返し、C++20 では明確なブール値による確認のために contains() が追加されました。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"key", 99}};
    std::cout << m.count("key") << '\n';
    std::cout << m.count("missing") << '\n';
    return 0;
}

反復処理

反復処理はできますが、順序は未規定です。ソート順や挿入順になるとは決して考えないでください。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}, {"c", 3}};
    int total = 0;
    for (const auto& [k, v] : m) total += v;
    std::cout << "sum = " << total << '\n';
    return 0;
}

削除

erase() はキーで要素を削除し、削除した要素数を返します。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m{{"a", 1}, {"b", 2}};
    m.erase("a");
    std::cout << m.count("a") << ' ' << m.size() << '\n';
    return 0;
}

頻度を高速に数える

順序が重要でない大規模なデータセットでは、unordered_map のほうが map より高速に頻度を数えられます。

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
    std::string items[] = {"a", "b", "a", "c", "b", "a"};
    std::unordered_map<std::string, int> freq;
    for (const auto& s : items) freq[s]++;
    std::cout << "a appears " << freq["a"] << " times\n";
    return 0;
}

at() を使う

at() は参照を返し、キーが存在しない場合は std::out_of_range をスローします。キーを挿入することはありません。

#include <iostream>
#include <unordered_map>

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

[] によるデフォルト挿入

[] で存在しないキーにアクセスすると、値初期化された値(int では 0)とともにそのキーが挿入されます。マップが暗黙に大きくなるため注意してください。

#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, int> m;
    std::cout << m["new"] << '\n';
    std::cout << "size: " << m.size() << '\n';
    return 0;
}

マップを空にする

clear() はテーブルを空にし、empty() は要素がないかどうかを報告します。

#include <iostream>
#include <unordered_map>

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

クイックチェック

unordered_map の順序について、理解度を確認しましょう。

まとめ

std::unordered_map について、次のことを学びました。

  • ハッシュテーブルを使い、操作は平均 O(1)
  • 順序は保証されない
  • map と同じ API(find、count、at、erase)を持つ

次は、高速に一意な要素を格納する unordered_set を学びます。

よくある質問

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

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

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

ハッシュベースの高速検索 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

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

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

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

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

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

  1. std::unordered_map
  2. unordered_set
  3. カスタムハッシュ関数
  4. パフォーマンス上の考慮事項
← C++ Academyに戻る