// C++ program to illustrate vector type

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;

int main() 
{
    // Creation
    set<int> set1;			// empty set
    set<int> set2 = {3, 5, 2, 1};	// {1,2,3,5}
    
    for (auto p = set2.begin(); p != set2.end(); p++)
        cout << *p << " ";
    cout << endl;

    // insert
    set2.insert(3);    // No change
    set2.insert(4);    // {1,2,3,4,5}

    for (auto p = set2.begin(); p != set2.end(); p++)
        cout << *p << " ";
    cout << endl;

    // remove
    set2.erase(0);    // No change
    set2.erase(4);    // {1,2,3,5}

    for (auto p = set2.begin(); p != set2.end(); p++)
        cout << *p << " ";
    cout << endl;


    // test if x is in set
    if ( set2.find(0) != set2.end() )
        cout << "0 is in set2" << endl;
    else
        cout << "0 is NOT in set2" << endl;

    if ( set2.find(3) != set2.end() )
        cout << "3 is in set2" << endl;
    else
        cout << "3 is NOT in set2" << endl;


    /* --------------------------------------------
       Advanced set operations
       -------------------------------------------- */
    set1 = {5, 6, 7};   // set2 = {1,2,3,5}
    set<int> out;       // Output

    // Union
    out = {};
    set_union( set1.begin(), set1.end(),
	       set2.begin(), set2.end(),
	       inserter(out, out.begin())  );

    for (auto p = out.begin(); p != out.end(); p++)
        cout << *p << " ";
    cout << endl;

    // Intersection
    out = {};
    set_intersection( set1.begin(), set1.end(),
                      set2.begin(), set2.end(),
                      inserter(out, out.begin())  );

    for (auto p = out.begin(); p != out.end(); p++)
        cout << *p << " ";
    cout << endl;

    // Difference   set2 - set1
    out = {};
    set_difference( set2.begin(), set2.end(),
                    set1.begin(), set1.end(),
                    inserter(out, out.begin())  );

    for (auto p = out.begin(); p != out.end(); p++)
        cout << *p << " ";
    cout << endl;



    return 0;
}
