关于C++的权值优先队列的问题

2025-01-31 06:35:46
推荐回答(2个)
回答1:

在C++中struct的作用跟class几乎一样,唯一不同的是在struct中的字段默认是public类型的,而在class中默认是private的。
好了,回到这个问题,把一个方法定义问友元,实际上破坏了class的封装性,但是提供了在类外访问类内部元素的一个方法,实际上友元函数并不属于这个类。
就上面那段代码而言,struct NodeWeightBig可以看做是NodeWeightBig类,它重载了<运算符,NodeWeightBig类的对象间就可以通过调用<重载函数来进行比较。
如果把这个类给某个容器,而这个容器恰好有某种排序功能,而且约定了要提供一个<重载方法,给它调用,然后通过这个方法进行权值比较,最终得出一个按权值排列的序列也比较好理解了。

希望对你有帮助。

回答2:

我想楼主是想用c++ stl的priority_queue
priority_queue 是一个模板类,其用最大堆实现了一下优先队列
由于维持堆序需要比较操作,要求类T必须了<运算符
bool operator< (NodeWeightBig n1,NodeWeightBig n2) 就是在重载 < 用于两个 NodeWeightBig 对象的比较, 具体的比较方法为判断谁的权更大
由于你用的是struct 没有private元素 不定义为友元也可以 即以下写法可以:

struct NodeWeightBig //权值最大优先队列结构体
{
int value;//数值
int weight;//权值
};
bool operator< (NodeWeightBig n1,NodeWeightBig n2)
{
return n1.weight< n2.weight;//为什么这样就可以比较权值????
}
若在类内重载<若不加friend 则参数只能有一个即

struct NodeWeightBig //权值最大优先队列结构体
{
int value;//数值
int weight;//权值
bool operator < (const NodeWeightBig& a) const {
return weight < a.weight;
}
};