std::set: 重複なし集合
自動ソート・重複排除。存在確認が高速。
std::set
順序付きで重複なしのコンテナ。
unordered_set
ハッシュベースで高速。
一意性
同じ値は1つだけ格納。
set とは?
重複を自動的に排除したい場合に最適です。`std::set` は要素を常にソートされた状態で保持するため、検索は高速(O(log N))ですが、順序が不要なら `std::unordered_set` の方がさらに高速(O(1))です。
#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: containsif (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)操作と集合演算
// イテレーション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の共通要素(積集合)を返す関数を作成してください。