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;
}