给定向量v
,我想循环遍历向量中的每个元素,并执行需要当前索引的操作。
我已经看到了用这两种方式编写的基本for循环:
// Using "<" in the terminating condition
for (auto i = 0; i < v.size(); ++i)
{
// Do something with v[i]
}
// Using "!=" in the terminating condition
for (auto i = 0; i != v.size(); ++i)
{
// Do something with v[i]
}
有什么实用的理由更喜欢其中一个而不是另一个吗?我经常看到使用<
编写它,但是使用!=
有性能优势吗?
有一个原因,尽管有点复杂,但更喜欢<
而不是!=
。
如果由于任何原因,lop的主体修改了i
并跳过阈值,则<
仍然终止循环,其中!=
将继续迭代。
在绝大多数情况下,这可能没有什么不同,但习惯<
可能会防止!=
不会出现的错误。还有一个额外的优势,那就是小得离谱,但<
写入的字符更少,所以它使源文件更小。
同样,上面的论点几乎是一个笑话,但如果你需要一个论点来使用一个而不是另一个,那你就有了
您可能更喜欢使用的范围。
有什么实际的理由更喜欢其中一个吗?
没有充分的理由选择这样或那样的方式,因为两者都有相同的行为。
即使结束条件不是累加器的值之一,如果增量大于1或初始值大于结束条件,也可以使用小于运算符。因此,它更通用,这意味着使用它可能总是更一致。一致性是一个弱论点,但如果你同意,弱论点总比没有论点好
性能没有差异。
如果您决定以这样的方式更改++i
,即循环将跨过所需的末端,则会产生巨大的差异。
为了便于其他程序员阅读您的代码,请使用他们期望看到的约定,即<
。当我看到i != ...
时;他跳过了那个值;。
这是<
的一个模糊错误——假设您使用字节大小的i
迭代所有256个chars
。该值将溢出,并且可能永远不会显示值256
。循环永远不会停止。!=
不会修复这个错误。