我在一个函数中有这段代码,但我无法理解它的作用。
....
#define ascend(i) do {\
int h = nodes[i].heavyindex;\
int p = nodes[i].heavypos;\
m##i = max(m##i + paths[h].ftree.sum(p), paths[h].stree.max_(0, p));\
i = paths[h].parent;\
} while (0)
while (nodes[a].heavyindex != nodes[b].heavyindex) {
if (nodes[a].heavyindex > nodes[b].heavyindex) {
ascend(a);
} else {
ascend(b);
}
}
#undef ascend
...我认为,#define的代码是:
#define ascend(i) do {\
int h = nodes[i].heavyindex;\
int p = nodes[i].heavypos;\
m##i = max(m##i + paths[h].ftree.sum(p), paths[h].stree.max_(0, p));\
i = paths[h].parent;\
} while (0)因此,函数中的真正代码只有以下内容:
while (nodes[a].heavyindex != nodes[b].heavyindex) {
if (nodes[a].heavyindex > nodes[b].heavyindex) {
ascend(a);
} else {
ascend(b);
}
}1)这是对的吗?
2)我希望将#define的代码移动到函数中,以便更好地理解它所做的事情,但是如何翻译下面的一行呢?
m##i = max(m##i + paths[h].ftree.sum(p), paths[h].stree.max_(0, p));\ 发布于 2015-03-20 00:22:35
##是令牌粘贴操作符。因此,在定义了#define f(i) m##i之后,f(a)将扩展到ma,f(b)将扩展到mb,等等。
因为这只有在预处理器中才有可能,所以您必须考虑其他东西才能将其实现为一个函数。通过引用传递ma和mb将是一个好主意。它可能看起来像这样:
提升(T& mi) {.mi = max(mi + pathsh.ftree.sum(p),pathsh.stree.max_(0,p));.}
其中T是ma和mb的类型。如果它们是不同类型的,则需要使其成为函数模板。https://stackoverflow.com/questions/29157212
复制相似问题