#include <iostream>
#include <queue>
#include <tuple>
#include <boost/ptr_container/ptr_vector.hpp>
struct point
{
int x;
int y;
};
bool operator<(const point& lhs, const point& rhs)
{
return std::tie(lhs.x, lhs.y) < std::tie(rhs.x, rhs.y);
}
std::ostream& operator<<(std::ostream& out, const point& p)
{
return out << p.x << ' ' << p.y;
}
namespace detail
{
template<typename>
struct ptr_less;
template<typename T>
struct ptr_less<T*>
{
bool operator()(const T& lhs, const T& rhs)
{
return lhs < rhs;
}
};
}
template<typename T>
using ptr_priority_queue = std::priority_queue<T*, boost::ptr_vector<T>, detail::ptr_less<T*>>;
int main()
{
// std::priority_queue<point*, boost::ptr_vector<point>, detail::ptr_less<point*>> points;
ptr_priority_queue<point> points;
points.push(new point{4, 1});
points.push(new point{3, 2});
points.push(new point{1, 6});
points.push(new point{3, 4});
while (!points.empty())
{
std::cout << points.top() << std::endl;
points.pop();
}
return 0;
}
// Sample output:
// 4 1
// 3 4
// 3 2
// 1 6
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDx0dXBsZT4KI2luY2x1ZGUgPGJvb3N0L3B0cl9jb250YWluZXIvcHRyX3ZlY3Rvci5ocHA+CgpzdHJ1Y3QgcG9pbnQKewogICAgaW50IHg7CiAgICBpbnQgeTsKfTsKCmJvb2wgb3BlcmF0b3I8KGNvbnN0IHBvaW50JiBsaHMsIGNvbnN0IHBvaW50JiByaHMpCnsKICAgIHJldHVybiBzdGQ6OnRpZShsaHMueCwgbGhzLnkpIDwgc3RkOjp0aWUocmhzLngsIHJocy55KTsKfQoKc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCBwb2ludCYgcCkKewogICAgcmV0dXJuIG91dCA8PCBwLnggPDwgJyAnIDw8IHAueTsKfQoKbmFtZXNwYWNlIGRldGFpbAp7CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KICAgIHN0cnVjdCBwdHJfbGVzczsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgc3RydWN0IHB0cl9sZXNzPFQqPgogICAgewogICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUJiBsaHMsIGNvbnN0IFQmIHJocykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBsaHMgPCByaHM7CiAgICAgICAgfQogICAgfTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdXNpbmcgcHRyX3ByaW9yaXR5X3F1ZXVlID0gc3RkOjpwcmlvcml0eV9xdWV1ZTxUKiwgYm9vc3Q6OnB0cl92ZWN0b3I8VD4sIGRldGFpbDo6cHRyX2xlc3M8VCo+PjsKCmludCBtYWluKCkKewogICAgLy8gc3RkOjpwcmlvcml0eV9xdWV1ZTxwb2ludCosIGJvb3N0OjpwdHJfdmVjdG9yPHBvaW50PiwgZGV0YWlsOjpwdHJfbGVzczxwb2ludCo+PiBwb2ludHM7CiAgICBwdHJfcHJpb3JpdHlfcXVldWU8cG9pbnQ+IHBvaW50czsKCiAgICBwb2ludHMucHVzaChuZXcgcG9pbnR7NCwgMX0pOwogICAgcG9pbnRzLnB1c2gobmV3IHBvaW50ezMsIDJ9KTsKICAgIHBvaW50cy5wdXNoKG5ldyBwb2ludHsxLCA2fSk7CiAgICBwb2ludHMucHVzaChuZXcgcG9pbnR7MywgNH0pOwoKICAgIHdoaWxlICghcG9pbnRzLmVtcHR5KCkpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHBvaW50cy50b3AoKSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgcG9pbnRzLnBvcCgpOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovLyBTYW1wbGUgb3V0cHV0OgovLyA0IDEKLy8gMyA0Ci8vIDMgMgovLyAxIDY=