l_615 @ 2023-07-18 16:27:20
看不懂
operator是什么意思,干什么的?
<(const Point &x) const 这一段又是什么意思,干什么的?
里面的x是哪来的?
struct Point // 自定义一个小根堆
{
int dd, p; // dd表示 p点到起点的距离
bool operator <(const Point &x) const {
return dd > x.dd;
}
};
priority_queue<Point> que;
by LittleAcbg @ 2023-07-18 16:29:52
@l_615
bool operator <(const Point &x) const {
return dd > x.dd;
}
就是说,设有两个 Point
类型 a,b
,则当 a.dd>b.dd
时,a<b
。这是一个运算函数定义。
by l_615 @ 2023-07-18 16:33:47
@LuoJingjia 虽然还是不懂,但是谢谢了
by LittleAcbg @ 2023-07-18 16:35:55
@l_615 它定义 Point
类型的大小关系。
设 Point a,b;
,当我们想要判断是否 a<b
时,系统会判断是否 a.dd>b.dd
。
by houmy @ 2023-07-18 16:36:23
@l_615
operator
是一个系统内置的函数,用来执行运算符。例如加号就是 operator+
,a+b
也可以写作 operator+(a,b)
。这句话就是重定义了小于运算符,使得可以对两个 Point
结构体做大小比较,方便 priority_queue
的比较。
因此,bool operator<
是一个函数,后面的 (const Point &x) const
是在声明这个函数的形式。可以拆解如下:
const Point &x
:声明了一个叫 x
的 Point
类型常量,传址。一般写作 Point x
,代码中写法是一个常数优化。
const
:注明函数对于相同的输入会有相同的输出,程序运行时如果前面对于同样的参数运行过这个函数,程序会直接调取前面的返回值。
这行代码简化后可以写成 bool operator<(Point x){
。多余部分用于常数优化。
by l_615 @ 2023-07-18 16:36:45
@LuoJingjia OKOK
by LittleAcbg @ 2023-07-18 16:38:14
@l_615 因为这样写比较难理解,所以我帮你这一段修改一下:
struct Point {int dd,p;};
bool operator <(const Point &a,const Point &b) {return a.dd > b.dd;}
priority_queue<Point> que;
这一段代码和你那段效果完全一样
by houmy @ 2023-07-18 16:38:31
例如有两个 Point
类型 a
,b
。a={100,1},b={50,2}
,则表达式 a<b
等同于 a.dd>b.dd
,返回 true
。
by l_615 @ 2023-07-18 16:38:45
@houmy 谢谢
by LittleAcbg @ 2023-07-18 16:39:30
@l_615 你那种写法可能常数会快一点,但作为初学者,我这种更方便理解
by l_615 @ 2023-07-18 16:43:27
@LuoJingjia 好的