什么循环用于可能在结束前中断的迭代?

时间:2010-09-23 11:59:41

标签: c++ loops iteration

我有一系列内存要解析。如果我在结束前找到某个字节序列,我会中断迭代。我想知道我应该选择哪个循环:

while(i < end && !sequenceFound ) {
    // parse
    i++;
}

或者

for( i; i < end && !sequenceFound; i++ ) {
    // parse
}

这用于从实现环形缓冲区的类派生的类的方法。超类提供iend。我的问题是,对于不熟悉代码的人,您认为哪一个更容易理解(表达更好的意图)?

编辑我发现序列是进一步解析流的必要条件。我可以使用break并设置sequenceFound = true,但这是多余的,还是我要严格要求?

9 个答案:

答案 0 :(得分:6)

为什么不在需要“中断”循环的时候使用break;。这似乎是大多数惯用语言表达您的意图的语言功能。它通常意味着您可以不使用额外的布尔状态跟踪变量。

如果您需要知道迭代是否提前终止,您可以使用condidition i != end.无论哪种方式,使用最清晰的控制方法看起来最好,break;在您想要的位置无论你是否保持“提前退出”变量,对我来说,休息似乎都是最清楚的。进行循环并测试一个你刚刚保证会失败的条件似乎是多余的。

答案 1 :(得分:4)

首选算法手写循环。

#include <algorithm>

auto it = std::find(begin, end, predicate);
if (it == end)
    :-(
else
    :-)

答案 2 :(得分:3)

对于具有显式限制的迭代,我通常会使用for循环。当迭代没有上限时,应该使用循环。

答案 3 :(得分:3)

对于具有循环变量和结尾的循环(即通过选中i != endi < end来检查在一个范围内运行的所有循环)我赞成for方法,因为这是更多或减去for的规范用法。

如果您可能过早地离开循环,break

for(; i != end; ++i) {
    // parse
    if (sequenceFound)
        break;
}

答案 4 :(得分:1)

我赞成while,因为它更好。可能是个人偏好。某些语言版本中的until也很好。

答案 5 :(得分:0)

第二个版本更适合理解,并允许使用continue运算符。

答案 6 :(得分:0)

如果我在每次迭代之前要检查多个条件,我通常会使用while循环。

答案 7 :(得分:0)

同意Charles Bailey,因为一旦你在迭代中中断,你就会立即摆脱最直接的循环结构,而不必重新评估一个条件变量。此外,您不需要额外的条件变量,从而减少(略微)代码块运行所需的内存。

答案 8 :(得分:0)

我更喜欢内部为for的{​​{1}}。

原因是你可以避免那些必须检查你的“休息”条件的丑陋构造,例如:

break

但是对于while版本或者内置条件的for,当然取决于你正在做什么,你不能轻易避免这种条件。