C++/Java排序&优先级队列
先定义一个简单数据结构: 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; });