求问重载"<"方法

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

xiaozhangma @ 2023-11-16 15:48:07

题解里都是这样写的:

struct Info{
    int dis;
    int pos;
    bool operator <(const Info &x)const{
        return x.dis < dis;
    }
};

蓝书上则是这样:

struct Info{
    int dis;
    int pos;
};
bool operator <(const Info &x, const Info &y){
    return x.dis < y.dis;
}

但用蓝书上的写法会出错:(


by Imiya @ 2023-11-16 16:04:18

@xiaozhangma 第二个 const 是针对 this。也就是说加了这个 const,你不能在函数里面修改 dis,pos。比如这样会报错:

struct Info{
    int dis;
    int pos;
    bool operator <(const Info &x)const{
      dis=0;
        return x.dis < dis;
    }
};

by xiaozhangma @ 2023-11-16 16:05:48

@Imiya this是什么?


by xiaozhangma @ 2023-11-16 16:08:21

@Imiya 能不能解释一下第二种写法“>”反而得到的是小根堆,蓝书上写的是“<”


by Miss_SGT @ 2023-11-16 16:10:45

pair是个好东西


by Imiya @ 2023-11-16 16:13:02

@xiaozhangma 把二元运算符重载写在里面则括号里声明的是第二个(右边的)元素,左边的元素可以直接调用里面的东西把前缀省了。所以第二种写法里的 x.dis 等价于第一种写法的 dis,第二种写法的 y.dis 等价于第一种写法的 x.dis


by LG_kemeng @ 2023-11-16 16:14:36

@xiaozhangma this是当前struct内的元素。

比如第一种可以写作:

struct Info{
  int dis,pos;
  inline bool operator<(const Info x)const
  {
    return x.dis<this.dis;
  }
}

然后两个排序方式不一样。第一种显然让x的dis要<当前值,也就是说这是按dis从大到小排序的。底下的写法是按dis从小到大排序的


by LG_kemeng @ 2023-11-16 16:17:00

@xiaozhangma 第一种写法等价于:

return dis>x.dis;

等价于:

inline bool cmp(register Info x,register Info y)
{return x.dis>y.dis;}

by xiaozhangma @ 2023-11-16 16:38:07

@LG_kemeng @Imiya 感谢


上一页 |