#include <cstdlib>    // for EXIT_SUCCESS

#include <iostream>   // for std::cout, std::endl
#include <memory>     // for std::unique_vec
#include <vector>     // for std::vector
#include <algorithm>  // for sort()

using std::unique_ptr;
using std::vector;
using std::cout;
using std::endl;
using std::sort;
using std::for_each;

bool sortfunction(const unique_ptr<int> &x, const unique_ptr<int> &y) {
  return *x < *y;
}

void printfunction(unique_ptr<int> &x) {
  cout << *x << endl;
}

int main(int argc, char **argv) {
  vector<unique_ptr<int> > vec;

  vec.push_back(unique_ptr<int>(new int(9)));
  vec.push_back(unique_ptr<int>(new int(5)));
  vec.push_back(unique_ptr<int>(new int(7)));

  // buggy: sorts based on the values of the ptrs
  sort(vec.begin(), vec.end());
  cout << "Sorted:" << endl;
  for_each(vec.begin(), vec.end(), &printfunction);

  // better: sorts based on the pointed-to values
  sort(vec.begin(), vec.end(), &sortfunction);
  cout << "Sorted:" << endl;
  for_each(vec.begin(), vec.end(), &printfunction);

  return EXIT_SUCCESS;
}