#include <stdio.h>
#include <memory>
#include <vector>
#include <list>

namespace mmap_allocator_namespace {
  template <typename T>
    class mmap_allocator: public std::allocator <T> {
      public: typedef size_t size_type;
      typedef T * pointer;
      typedef
      const T * const_pointer;

      template <typename _Tp1>
      struct rebind {
        typedef mmap_allocator <_Tp1> other;
      };

      pointer allocate(size_type n,
        const void * hint = 0) {
        fprintf(stdout, "Alloc %d bytes.\n", n * sizeof(T));
        return std::allocator <T> ::allocate(n, hint);
      }

      void deallocate(pointer p, size_type n) {
        fprintf(stdout, "Dealloc %d bytes (%p).\n", n * sizeof(T), p);
        return std::allocator <T> ::deallocate(p, n);
      }

      mmap_allocator() throw (): std::allocator <T> () {
        fprintf(stdout, "Hello allocator!\n");
      }
      mmap_allocator(const mmap_allocator & a) throw (): std::allocator <T> (a) {}
      template <class U>
      mmap_allocator(const mmap_allocator <U> & a) throw (): std::allocator <T> (a) {}~mmap_allocator() throw () {}
    };
}

using namespace std;
using namespace mmap_allocator_namespace;

int main() {
  // раскомментируем нужное:	
  // vector<int, mmap_allocator<int>> int_vec(32, 0, mmap_allocator<int>());
  // list<int, mmap_allocator<int>> int_lst(32, 0, mmap_allocator<int>());
  return 0;
}