Page List

Search on the blog

2012年11月18日日曜日

知ってると便利なSTL(10) set_intersection, set_union, set_difference

何をするものか?
2つの集合の和集合、積集合、差集合を計算し、別のコンテナに格納します。

使い方
演算対象となる2つの集合はソート済みでなければいけません。(ソートされていなければ、まずソートしてください。)
それぞれ以下のように使います。まずは、積集合を計算するset_intersectionの使用例。第5引数には結果の出力先となるコンテナのイテレータを指定します。back_inserter(v)とすると、vの最後尾に結果が挿入されます。
// set_intersection
int main() {
    int x[] = {2, 4, 6, 8, 10, 12, 14};
    int y[] = {3, 6, 9, 12, 15, 18};

    vector<int> v;
    set_intersection(x, x+7, y, y+6, back_inserter(v));
    
    for (int i = 0; i < (int)v.size(); i++)
        cout << v[i] << endl;     // 6 12

    return 0;
}

次に、和集合を計算するset_unionの使用例。
// set_union
int main() {
    int x[] = {2, 4, 6, 8, 10, 12, 14};
    int y[] = {3, 6, 9, 12, 15, 18};

    vector<int> v;
    set_union(x, x+7, y, y+6, back_inserter(v));
    
    for (int i = 0; i < (int)v.size(); i++)
        cout << v[i] << endl;    // 2 3 4 6 8 9 10 12 14 15 18

    return 0;
}

最後に、差集合を計算するset_difference。
// set_difference
int main() {
    int x[] = {2, 4, 6, 8, 10, 12, 14};
    int y[] = {3, 6, 9, 12, 15, 18};

    vector<int> v;
    set_difference(x, x+7, y, y+6, back_inserter(v));
    
    for (int i = 0; i < (int)v.size(); i++)
        cout << v[i] << endl;   // 2 4 8 10 14
 
    return 0;
}

0 件のコメント:

コメントを投稿