经典的 Dijkstra 算法中,有点不懂的,求教

struct qnode {
int v; typec c;
qnode (int vv = 0, typec cc = 0) : v(vv), c(cc) {}
bool operator < (const qnode& r) const { return c>r.c; }
};

请教 qnode (int vv = 0, typec cc = 0) : v(vv), c(cc) {} 是什么意思

还有这句: bool operator < (const qnode& r) const { return c>r.c; } 也不懂

struct qnode 里面用的是 C++ 的语法,把结构体当做一个类来定义。
语句解析:
1) qnode (int vv = 0, typec cc = 0) : v(vv), c(cc) {}
a)函数 qnode 是 struct qnode 的构造函数,
b)参数有两个:int w 和 typec c ,都有默认值 0 。默认值的作用是调用 qnode 这函数的时 候,如果不给参数传值,那么就是用默认值,如:

qnode(1,2); // 给第一个参数w 和第二个参数 cc 都制定值
qnode(3); // 等价于 qnode(3,0); 第二个参数 cc 使用默认值 0
qnode(); // 等价于 qnode(0,0); 第一个参数w 和第二个参数 cc 都使用默认值 0

c)":" 后面的 v(w),c(cc) 是给结构体里面定义的两个变量 int v; typec c; 赋值,
相当于:v=w,c=cc; 如果不用这种形式,还可以改成:
qnode (int vv = 0, typec cc = 0) {v=w,c=cc;}

2) bool operator < (const qnode& r) const { return c>r.c; }
a) 这是重载运算符"<",也就是“小于号”,让小于号两边的操作数可以是结构体 struct qnode。
比如:
struct qnode a,b;
/*
只有重载运算符"<",a<b 才能编译通过,否则编译无法通过,
因为C(C++)编译器默认是不知到如何比较两个 sturct qnode 类型的变量的。
*/
if(a<b){}

b) 上面例子中的 if(a<b) 具体是如何比较的呢?
我们假设:a.c = 1; b.c = 2;
那么通过函数体里面:
return c>r.c;
我们知道两个 struct qnode 比较的时候,只和结构体里面的 typec c 变量有关,和其他变量无关。
因此 a<b 返回真。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-01
这个应该是C++里面的写法。

在C++里面,结构体是可以有构造函数的,qnode (int vv = 0, typec cc = 0) : v(vv), c(cc) {}就是缺省的构造函数。
你把它当类来理解就是了,只是结构体的默认类型是public,而类里面默认是private。
后面那个就是重载“<”运算符了。追问

嗯,关键是这里 : v(vv), c(cc) {} 冒号后的部分代表什么

后面那个,还是有点不懂,可以解释清楚点吗

追答

qnode (int vv = 0, typec cc = 0) : v(vv), c(cc) {}
类似于:
qnode (int vv = 0, typec cc = 0)
{
v = vv;
c =cc;
}
就是构造函数初始化列表。

追问

谢谢你的回答