我需要实现我自己版本的基于优先级队列的Dijkstra算法,在搜索一些关于它的站点时,我看到了一个实际上有效的算法,但使用了奇怪的for-loop语句:
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
}我知道; after循环意味着它是空语句,但是如果我注释second for-loop,这个程序就会停止工作,所以它实际上是有意义的。我相信这个u = j++应该类似于start form u = j+1,但我不太确定。
发布于 2019-04-24 00:18:36
j=0; while(QS[j])j++;使用for(j = 0; QS[j]; j++);
即找到QS[j]为假的第一个j
发布于 2019-04-24 00:21:24
for(j = 0; QS[j]; j++);将j设置为0,然后递增j,直到QS中的第一个元素为false。然后使用该值作为第三个循环的初始值。
这是一种更简洁的编写方式,但是您可以使用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元素的距离。
发布于 2019-04-24 00:21:38
第二个for循环遍历所有数组QS,这是一个布尔值数组。这将在1为假时中断,保存j的当前值并使用该值+1开始下一次循环。
https://stackoverflow.com/questions/55815414
复制相似问题