#include <iostream>
#include <utility>
#include <map>
#include <list>
struct Asteroid {};
typedef std::list<Asteroid> list_t;
typedef list_t::iterator iter_t;
typedef std::pair<iter_t, iter_t> pair_t;
struct Comp {
    bool operator()(const pair_t& p1, const pair_t& p2) const { 
           return &*p1.first < &*p2.first ? true : 
                  &*p2.first < &*p1.first ? false : 
                  &*p1.second < &*p2.second; // won't handle the end iterators!
    }
};
int main()
{
    list_t l;
    l.push_back(Asteroid());
    l.push_back(Asteroid());
    l.push_back(Asteroid());

    std::map<pair_t, double, Comp> m;
    m[make_pair(l.begin(), l.begin())] = 3.14;
    m[make_pair(l.begin(), std::next(l.begin()))] = 3.14;
    m[make_pair(l.begin(), l.begin())] = 3.14;

    std::cout << "Map has " << m.size() << " elements\n";
}