C++ 对于可能在结束前中断的迭代,使用哪个循环?

C++ 对于可能在结束前中断的迭代,使用哪个循环?,c++,loops,iteration,C++,Loops,Iteration,我有一个要解析的内存范围。如果我在结束之前找到某个字节序列,我就会中断迭代。我想知道在这里我更喜欢哪个循环: while(i < end && !sequenceFound ) { // parse i++; } while(i

我有一个要解析的内存范围。如果我在结束之前找到某个字节序列,我就会中断迭代。我想知道在这里我更喜欢哪个循环:

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

<代码>for(i;i 这在从实现环形缓冲区的类派生的类的方法中使用。超类提供了
i
end
。我的问题是,对于不熟悉代码的人,您认为哪一个更容易理解(更好地表达意图)


编辑我发现序列的事实对于进一步解析流是必要的。我可以使用
break
并设置
sequenceFound=true
,但这是多余的,还是我在这里太严格了?

我喜欢
,而在这里设置
,因为这样读起来更好。不过这可能是个人喜好<代码>直到在某些语言中可用的
也很好。

对于有明确限制的迭代,我通常使用For循环。而循环应该在迭代没有上限时使用。

第二个版本更便于理解,并允许使用continue操作符。

为什么不使用
break在遇到需要“中断”循环时。这似乎是最惯用的表达你意图的语言特征。这通常意味着您可以不使用额外的布尔状态跟踪变量


如果您需要知道迭代是否提前终止,可以使用条件
i!=结束。
无论哪种方式,使用最清晰的控制方法似乎都是最好的,
中断在您想要中断的点对我来说似乎是最清楚的。继续循环并测试一个您刚刚保证会失败的条件似乎是多余的。

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

对于带有循环变量和结束的循环(即,对于通过检查
i!=end
i
在某个范围内运行的所有循环),我赞成
For
方法,因为这或多或少是
For
的规范用法

如果您可能过早离开循环,
中断

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

同意Charles Bailey的观点,因为一旦在迭代中中断,就可以立即中断最直接的循环结构,而无需重新计算条件变量。另外,您不需要额外的条件变量,从而减少了代码块运行所需的内存。

我更喜欢内部带有
中断的
for

原因是您可以避免必须检查“中断”条件的丑陋结构,例如:

for(; i != end; ++i) {

    // do stuff

    if (sequenceFound) break;

    // you don't need an 'if(!sequenceFound)' around this block of code
    // do more stuff
}

但是,无论是while版本还是for版本,都内置了条件,当然这取决于您所做的工作,您无法轻易避免这种条件。

更喜欢算法而不是手写循环

#include <algorithm>

auto it = std::find(begin, end, predicate);
if (it == end)
    :-(
else
    :-)
#包括
auto it=std::find(开始、结束、谓词);
if(it==end)
:-(
其他的
:-)

为什么不
中断找到序列后?稍后需要变量,我将该信息编辑到我的问题中。如果是这种情况,我通常会在循环后检查
if(I==end)
以查看我是否跳出了loop@Space_C0wb0y例如我确实说过,如果您需要知道迭代是否提前终止,可以使用条件
i!=结束
。无论哪种方式,使用最清晰的控制方法似乎都很简单,
break
对于我来说,无论您是否维护“提前退出”变量,在您想要中断的点上似乎最清晰。这似乎是多余的进行循环和测试的条件,你只是刚刚保证会失败。我接受了主要是因为你的评论以上。如果你得到了答案的那一部分,那就太好了。+1使用中断意味着你不需要for循环中复杂的结束条件。人们并不真正了解for循环的条件,因为它们通常是相同的。
#include <algorithm>

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