// Illustrating the use of an adaptor for pointers to functions
#include <iostream>
#include <string>
#include <set>
using namespace std; 

bool less1(const string& x, const string& y)
{
  return x < y;
}

bool greater1(const string& x, const string& y)
{
  return x > y;
}

int main()
{
  cout << "Illustrating the use of an adaptor" 
       << " for pointers to functions." << endl;

  typedef 
    set<string, 
        pointer_to_binary_function<const string&, 
                                   const string&, bool> >  
    set_type1;

  set_type1 set1(ptr_fun(less1));

  set1.insert("the");
  set1.insert("quick");
  set1.insert("brown");
  set1.insert("fox");

  set_type1::iterator i;
  for (i = set1.begin(); i != set1.end(); ++i) 
    cout << *i << " ";
  cout << endl;
  
  set_type1 set2(ptr_fun(greater1));

  set2.insert("the");
  set2.insert("quick");
  set2.insert("brown");
  set2.insert("fox");

  for (i = set2.begin(); i != set2.end(); ++i) 
    cout << *i << " ";
  cout << endl;
  return 0;
}

