首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >for循环后的分号是什么意思?为什么会有j++ in first loop语句?

for循环后的分号是什么意思?为什么会有j++ in first loop语句?
EN

Stack Overflow用户
提问于 2019-04-24 00:14:29
回答 3查看 91关注 0票数 1

我需要实现我自己版本的基于优先级队列的Dijkstra算法,在搜索一些关于它的站点时,我看到了一个实际上有效的算法,但使用了奇怪的for-loop语句:

代码语言:javascript
复制
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,但我不太确定。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-24 00:18:36

j=0; while(QS[j])j++;使用for(j = 0; QS[j]; j++);

即找到QS[j]为假的第一个j

票数 4
EN

Stack Overflow用户

发布于 2019-04-24 00:21:24

代码语言:javascript
复制
for(j = 0; QS[j]; j++);

j设置为0,然后递增j,直到QS中的第一个元素为false。然后使用该值作为第三个循环的初始值。

这是一种更简洁的编写方式,但是您可以使用std::findstd::distance更具表现力地描述它所做的事情,比如

代码语言:javascript
复制
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元素的距离。

票数 1
EN

Stack Overflow用户

发布于 2019-04-24 00:21:38

第二个for循环遍历所有数组QS,这是一个布尔值数组。这将在1为假时中断,保存j的当前值并使用该值+1开始下一次循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55815414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档