先定义一个简单数据结构: Point, 其包含横坐标x和纵坐标y
排序规则定义: x的优先级大于y, 先判断x再判断y
这里均实现递增式

class Point {
    int x, y;
};

C++排序: lambda

vector<Point> points;
sort(points.begin(), points.end(), [](Point& p1, Point& p2) {
    // 升序, 前 < 后
    if (p1.x != p2.x) {
       return p1.x < p2.x;
    }
    return p1.y < p2.y;
});

C++优先级队列: 重载运算符 '<' , 与 sort 方法的 lambda 相反
理解: 现有一个大顶堆, 新元素进来需要跟堆顶进行比较 ( 新元素优先级是否比堆顶小: '<' )
-> 如果元素的 x 比堆顶的 x 大, 则其优先级比堆顶小

// 等价于priority_queue<Point, vector<Point>, less<Point>> maxHeap;
priority_queue<Point> maxHeap; // 视为大顶堆
class Point {
public:
    // less需要重载'<', greater则需要重载'>'
    bool operator < (const Point& other) const {
        // 升序, 前 > 后
        if (x != other.x) {
            // 与sort的lambda内相反
            return x > other.x;
        }
        return y > other.y;
    }
    int x, y;
};

Java排序: lambda

List<Point> points;
Collections.sort(points, (p1, p2) -> {
    // 升序, 前减后
    if (p1.x != p2.x) {
       return p1.x - p2.x;
    }
    return p1.y - p2.y;
});

Java优先级队列: lambda, 与 sort 方法的 lambda 相同

PriorityQueue<Point> heap = new PriorityQueue<>((p1, p2) -> {
    // 升序, 前减后
    if (p1.x != p2.x) {
        return p1.x - p2.x;
    }
    return p1.y - p2.y;
});