#Z3021. set 和结构体练习

set 和结构体练习

#include <iostream>
#include <set>
using namespace std;

int main() {
  

    return 0;

}

用set来储存一个二维坐标系上的点的集合。

  1. 首先使用定义一个用来储存点的结构体Point,里面有两个成员变量,分别用来存 X 坐标和 Y坐标。 在main函数的上方写下
struct Point {
    int x, y;
};
  1. 给这个结构体添加<的运算符重载,让编译器知道该怎么对这个结构体比较大小。 在结构体里int x, y;下面接着写下
bool operator<(const Point &rhs) const {
    if (x == rhs.x) {
        return y < rhs.y;
    } else {
        return x < rhs.x;
    }
}

如果两个点的x相同,也就是x == rhs.x,那么我们用y来比较,否则就直接比较x,这一点和用sort排序其实是一样的原理。

  1. 定义一个储存点的容器,然后从标准输入输入一个整数 n,然后从标准输入输入 n 个点存储到set中。 在main函数里面写下
int n;
set<Point> v;
cin >> n;
for (int i = 0; i < n; i++) {
    Point temp;
    cin >> temp.x >> temp.y;
    v.insert(temp);
}
  1. 输出集合中的点。 还记得->运算符吗?it->x和(*it).x的效果是一样的,就是获取迭代器it指向的结构体里x变量的值。 最后输出的点的个数可能和输入的不一样,因为如果重复加入一个点是没有效果的哦。 继续在上一步代码后面写下
for (set<Point>::iterator it = v.begin(); it != v.end(); it++) {
    cout << it->x << " " << it->y << endl;
}

点击 运行,然后输入如下数据查看效果。

6
5 6
1 2
2 1
3 4
1 2
1 1