求捞,悬关

P4779 【模板】单源最短路径(标准版)

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 是在声明这个函数的形式。可以拆解如下:

这行代码简化后可以写成 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 类型 aba={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 好的


| 下一页