我需要基于优先级队列实现自己的Dijkstra算法版本,并且在搜索一些有关该站点的站点时,我看到了一种确实有效的算法,但带有奇怪的for循环语句:
int i,j,n;
cin >> n; //number of vertexes
bool *QS = new bool [n];
//whole QS is set to false here
for(i = 0; i < n; i++) {
for(j = 0; QS[j]; j++);
for(u = j++; j < n; j++)
if(!QS[j] && (d[j] < d[u])) //d[i] is table of distances
u = j;
QS[u] = true;
//some code
}
我知道循环后的;
表示它是空语句,但是如果我再评论for-loop
,该程序将停止工作,因此实际上意味着某些事情。我相信这个u = j++
的意思就像是起始表格u = j+1
,但我不确定。
答案 0 :(得分:4)
for(j = 0; QS[j]; j++);
用作j=0; while(QS[j])j++;
即查找QS[j]
为假的第一个j
答案 1 :(得分:1)
for(j = 0; QS[j]; j++);
将j
设置为0,然后递增j
直到QS
中的第一个元素为假。然后,将该值用作第三个循环的初始值。
这是一种切肉刀的书写方式,但是您可以像使用std::find
和std::distance
这样来表达更多表情
for(i = 0; i < n; i++) {
int j = std::distance(std::begin(QS), std::find(std::begin(QS), std::end(QS), false));
for(u = j++; j < n; j++)
if(!QS[j] && (d[j] < d[u])) //d[i] is table of distances
u = j;
QS[u] = true;
//some code
}
其中明确指出j
是从数组开头到第一个false元素的距离。
答案 2 :(得分:0)
第二个for循环遍历所有数组QS 布尔数组。当一个为假时,它将中断,保存j的当前值,并从该值+1开始下一个循环。