ソート済みの 2 つの範囲に対する和集合・積集合・差集合・対称差を O(m+n) で求めるアルゴリズム。集合論の操作を STL で 1 行で書けます。
| 関数 | 意味 | 例: A={1,2,3}, B={2,3,4} |
|---|---|---|
std::set_union | A ∪ B(どちらかに含まれる) | {1,2,3,4} |
std::set_intersection | A ∩ B(両方に含まれる) | {2,3} |
std::set_difference | A - B(A にあり B にない) | {1} |
std::set_symmetric_difference | (A-B) ∪ (B-A) | {1,4} |
std::includes | B ⊆ A か | false |
std::merge | 2 つのソート済み列をマージ | {1,2,2,3,3,4} |
共通の前提:入力範囲はソート済みでなければいけません(ソートされていないと結果が正しくない)。
目安:集合演算を 1 回だけ → vector+sort が速い。頻繁に更新しながら使う → std::set。
std::set_union が要求する入力は?back_inserter なら出力サイズが未知でも柔軟。サイズが分かっていれば out.resize(...) して out.begin() でも可。