0Pricing
C++ Academy · レッスン

unordered_set

ハッシュベースの一意な要素

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

unordered_set とは

std::unordered_set は一意な要素をハッシュテーブルに格納します。メンバーシップテストは平均で定数時間ですが、ソート順はありません。

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{1, 2, 3, 2, 1};
    std::cout << s.size() << " unique values\n";
    return 0;
}

set と unordered_set の比較

map の場合と同様です。

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

最速のメンバーシップ確認が必要なら unordered_set を選びます。

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> seen{"a", "b", "c"};
    std::cout << (seen.count("b") ? "yes" : "no") << '\n';
    return 0;
}

値を挿入する

insert() は要素を追加します。すでに存在する場合は無視し、追加されたかどうかを .second で示すペアを返します。

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s;
    auto a = s.insert(5);
    auto b = s.insert(5);
    std::cout << std::boolalpha << a.second << ' ' << b.second << '\n';
    return 0;
}

高速なメンバーシップテスト

ある値をすでに確認したかどうかを調べるのが、典型的な用途です。count() は 0 または 1 を返します。

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> blocked{"spam", "junk"};
    std::cout << blocked.count("spam") << '\n';
    std::cout << blocked.count("ok") << '\n';
    return 0;
}

要素を削除する

erase() は値を削除し、削除した要素数(0 または 1)を返します。

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{1, 2, 3};
    s.erase(2);
    std::cout << "count 2: " << s.count(2) << '\n';
    std::cout << "size: " << s.size() << '\n';
    return 0;
}

重複を検出する

要素を挿入し、そのブール結果を確認することで、ストリーム内の最初の重複を検出できます。

#include <iostream>
#include <unordered_set>

int main() {
    int data[] = {3, 7, 1, 7, 9};
    std::unordered_set<int> seen;
    for (int x : data) {
        if (!seen.insert(x).second) {
            std::cout << "first duplicate: " << x << '\n';
            break;
        }
    }
    return 0;
}

反復処理

反復処理はできますが、順序は未規定です。特定の並びを前提にせず、要素を合計したり処理したりしてください。

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> s{10, 20, 30};
    int total = 0;
    for (int x : s) total += x;
    std::cout << "sum = " << total << '\n';
    return 0;
}

範囲から重複を除去する

範囲から unordered_set を構築すると、重複をすばやく除去できます(順序は保持されません)。

#include <iostream>
#include <unordered_set>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 2, 3, 3, 3};
    std::unordered_set<int> u(v.begin(), v.end());
    std::cout << u.size() << " unique\n";
    return 0;
}

find と count の比較

find() は要素へのイテレータを返すため、その要素をさらに使用できます。一方、count() は存在するかどうかを報告するだけです。

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<std::string> s{"alpha", "beta"};
    auto it = s.find("beta");
    std::cout << (it != s.end() ? *it : "none") << '\n';
    return 0;
}

クリアと空かどうかの確認

clear() はすべての要素を削除し、empty() は要素がないかどうかを確認します。

#include <iostream>
#include <unordered_set>

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

集合の共通部分

共通する要素を見つけるには、一方の集合をループし、もう一方の集合でメンバーシップを確認します。

#include <iostream>
#include <unordered_set>

int main() {
    std::unordered_set<int> a{1, 2, 3, 4};
    std::unordered_set<int> b{3, 4, 5};
    for (int x : a) if (b.count(x)) std::cout << x << ' ';
    std::cout << '\n';
    return 0;
}

クイックチェック

unordered_set について、理解度を確認しましょう。

まとめ

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

  • 平均 O(1) の操作で一意な要素を格納する
  • 順序は保証されない
  • 高速なメンバーシップテストと重複検出に最適である

次は、独自のカスタム型をハッシュする方法を学びます。

よくある質問

「unordered_set」レッスンは無料ですか?

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

「unordered_set」で何を学びますか?

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

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

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

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

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

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

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

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

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