循环循环算法

时间:2018-07-06 13:37:23

标签: c++ algorithm round-robin

如何实现永远循环运行的循环算法?

for (int i = 0; ;i++){
    roundRobinIndex = i % numberOfWorkers;
}

上述方法的问题是integer overflow问题。也可以通过检查i的值来实现:

for (int i = 0; ;i++){
    roundRobinIndex = i % numberOfWorkers;
    if i == maxNumber{
        i = 0;
    }
}

但是这种方式很难看。也许还有更优雅的方式?

4 个答案:

答案 0 :(得分:3)

为什么不呢?

int numberOfWorkers = 10
int roundRobinIndex = numberOfWorkers - 1
while(true){
    roundRobinIndex = (roundRobinIndex + 1) % numberOfWorkers
}

或带有for循环

for (int i = 0; ;i = (i + 1) % numberOfWorkers){
    roundRobinIndex = i;
}

我们现在可以摆脱i

答案 1 :(得分:3)

避免任何模调用,我们可以这样做:

constexpr int nextRR(int curIdx, int sz) {
    if(curIdx==sz-1) {
        return 0;
    }
    return curIdx+1;
}

for (int rrIndex = 0;;rrIndex = nextRR(rrIndex, sz)) {
    // use rrIndex here ...

}

如果在编译时未知工作者的数量,那么这将比任何基于模块的解决方案在性能上更加有效。

请注意,nextRR也可以这样写,以进一步优化与0的比较比与与变量的比较更快的平台:

constexpr int nextRR(int curIdx, int sz) {        
    if(curIdx==0) {
        return sz-1;
    }
    return curIdx-1;
}

答案 2 :(得分:0)

出于完整性考虑(我同意pLopeGG的回答更为简洁)-如果您将i设置为unsigned int而不是int,则您的方式将非常有效,因为溢出是在未签名溢出的标准,但未签名。

for (unsigned int i = 0; ;i++){
    roundRobinIndex = i % numberOfWorkers;
}

答案 3 :(得分:-1)

为什么不将%放入循环中?

for (int i = 0; ;++i, i %= numberOfWorkers)
{
}