#include <iostream>
#include <set>
#include <algorithm>

using namespace std;

// template <typename T>
void print(typename set<int>::const_iterator start,
           typename set<int>::const_iterator end, plus<int> pl, int m)
{
    for (; start != end; start++)
    {
        cout << pl(*start, m) << " ";
    }
    cout << endl;
}

void print(typename set<int>::const_iterator start,
           typename set<int>::const_iterator end, multiplies<int> mul, int m)
{
    for (; start != end; start++)
    {
        cout << mul(*start, m) << " ";
    }
    cout << endl;
}

void show(int n)
{
    cout << n << " ";
}

// 二元仿函数
class PrintPlus : public binary_function<int, int, void>
{
public:
    void operator()(const int &n1, const int &n2) const
    {
        cout << n1 << "+" << n2 << " = " << n1 + n2 << endl;
    }
};

int main()
{
    int m[] = {1, 2, 3, 4, 8, 5, 1, 2};
    // set 会自动过滤重复，并排序
    set<int> s(m, m + sizeof(m) / sizeof(m[0]));
    // print(s.begin(), s.end(), plus<int>(), 1);
    // print(s.begin(), s.end(), multiplies<int>(), 3);

    // for_each(s.begin(), s.end(), show);
    // cout << endl;

    // PrintPlus 测试
    // for (int i = 0; i < 6; i++)
    for_each(s.begin(), s.end(), bind1st(PrintPlus(), i));

    return 0;
}
