Listing 4

#include <algorithm>
#include <array>
#include <functional>
#include <iostream>
#include <iterator>
using std::tr1::array;
using std::cout; using std::ostream_iterator;
using std::not2; using std::not_equal_to;
using std::unique;

typedef int elt;
typedef array<elt, 7> arr;
typedef arr::iterator arr_it;

template <class Func>
void apply(Func func)
  { // use func to eliminate duplicates in a range
  arr data = { 1, 1, 2, 3, 3, 3, 5 };
  arr_it end = unique(data.begin(), data.end(), func);
  copy(data.begin(), end, ostream_iterator<elt>(cout, " "));
  cout << '\n';
  }
int main()
  { // use not2 and predicate not_equal_to to eliminate duplicates in a range
  apply(not2(not_equal_to<int>()) );
  return 0;
  }