std::set: 重複なし集合

自動ソート・重複排除。存在確認が高速。

std::set
順序付きで重複なしのコンテナ。
unordered_set
ハッシュベースで高速。
一意性
同じ値は1つだけ格納。

set とは?

招待者リスト (VIP List)

setは「パーティーの招待者リスト」です。同じ名前(重複)を二重登録することはできません。誰かが来たらリストをチェックし、まだ載っていなければ追加します。また、名簿は常にあいうえお順(ソート済み)に並んでいます。

重複を自動的に排除したい場合に最適です。`std::set` は要素を常にソートされた状態で保持するため、検索は高速(O(log N))ですが、順序が不要なら `std::unordered_set` の方がさらに高速(O(1))です。

set & unordered_set
#include <set>
#include <unordered_set>
// 順序付きセット(赤黒木)
std::set<int> s;
s.insert(3);
s.insert(1);
s.insert(2);
// 自動的にソート: {1, 2, 3}
// 存在確認
if (s.count(2)) { // 1 or 0
// 存在する
}
// C++20: contains
if (s.contains(2)) { }
// ハッシュセット(高速)
std::unordered_set<std::string> fast;
fast.insert("apple");
実行結果
insert(3,1,2) → {1, 2, 3} (自動ソート)
s.count(2) = 1 (存在)
s.count(99) = 0 (存在しない)
Bad
// ❌ Bad: vector で重複チェック
std::vector<int> v;
if (std::find(v.begin(), v.end(), x) == v.end()) {
v.push_back(x); // O(n) 検索
Good
// ✅ Good: set で重複排除
std::set<int> s;
s.insert(x); // O(log n) または O(1)

操作と集合演算

Set Operations
// イテレーション
for (const auto& elem : s) {
std::cout << elem << " ";
}
// 削除
s.erase(2);
// 範囲
auto it = s.lower_bound(5); // 5 以上の最小
auto it2 = s.upper_bound(5); // 5 より大きい最小
// 集合演算(algorithm ヘッダ)
std::set<int> a = {1, 2, 3};
std::set<int> b = {2, 3, 4};
std::set<int> result;
// 和集合
std::set_union(a.begin(), a.end(),
b.begin(), b.end(),
std::inserter(result, result.begin()));
Tip: 順序が不要なら unordered_set が高速。

合格ライン

set と unordered_set を使い分けられる
contains/count で存在確認できる

参考リンク

演習課題

課題1: 重複削除
vectorから重複要素を削除してsetを使って返す関数を作成してください。
課題2: 集合演算
2つのsetの共通要素(積集合)を返す関数を作成してください。

次のステップ