我已经看到这两个声明:
for(i=0;i<10;i++)
for(i=0;i!=10;i++)
我知道当我到达10
时它们都会停止,但似乎最好使用第二个(我听说过)。
有什么不同?我也想知道何时使用迭代器来访问向量的成员,迭代器条件< vec.end()
和!= vec.end()
答案 0 :(得分:74)
for(i = start; i != end; ++i)
这是“标准”迭代器循环。它的优点是它可以与指针和标准库迭代器一起使用(您不能依赖定义了operator<
的迭代器)。
for(i = start; i < end; ++i)
这不适用于标准库迭代器(除非它们定义了operator<
),但它的优势在于,如果由于某种原因超过end
,它仍会停止,所以它稍微安全一些。我在迭代整数时被教导使用它,但我不知道它是否真的被认为是“最佳实践”。
我通常写这些的方式是首选<
。
答案 1 :(得分:12)
两者都适用于大多数情况。
如果由于某种原因,在循环中执行的代码体将i
更改为大于10
的内容,则第一个版本将停止循环,但第二个版本将永久执行。
答案 2 :(得分:10)
我的日常做法是在使用简单类型(如整数)循环时使用<
,并在使用stl-kind迭代器时使用!=
答案 3 :(得分:7)
for ( initialization ; termination condition ; iteration )
对于每一个,选择最适合自己的要求,对于termination condition
,您可以使用任何二元条件运算符,例如>
,<
,{{1 },>=
,<=
对于您提出的问题,请考虑随机案例,
!=
在这种情况下,循环结果是无限的。相反,如果你使用条件for(i=0;i!=10;i++)
{
.
.
i=11; //somewhere if the loop variable is changed to a value greater than 10 (this assumption is solely for demo)
.
.
.
}
,这就像往常一样。所以我的观点是第一种方法更严格地设置条件严格。
答案 4 :(得分:6)
最佳做法是使用!=仅使用迭代器(C ++)和&lt;除此以外。永远不要使用==或!=浮点数/双打。以下循环是无限循环:
for (double i = 0.0; i != 1.0; i += 0.1)
printf("yes, I'm an infinite loop ;)");
答案 5 :(得分:5)
!=将允许测试评估为真,而&lt;如果我超过10或仅仅等于它,会导致它评估为假。
如果i的值可能在循环体内发生变化,这可能是一个考虑因素。
但是,如果你只想做一些事情,那么&lt;更具描述性,但要么就足够了。 !=应该,对于简单的逐步完成10个项目和笨拙的工作类型的循环,在明确你的意图方面被认为是次优的。
答案 6 :(得分:4)
我知道当我达到10时它们都会停止,但似乎更好用 第二个(我听说过)。
这是微观优化。使用更有意义的东西(以上<
更有意义)。
有什么不同?
第一个版本使用不等式运算符!=
,第二个版本使用less运算符<
。
答案 7 :(得分:1)
我通常在for循环中使用<
,原因是其他人说的。在while循环和更高级的for循环中,!=
可以更容易地推断出我的程序的作用。
假设我想在像[5,5,5,3,5,2,3,2,0]
这样的数组中第一次运行'5'之后找到位置。我们希望k
成为0 <= i < k => a[i] = 5
:
int pos = 0;
// Inv: a[0..pos) = 5
while (pos != N && a[pos] == 5)
pos = pos+1;
循环执行后,我们知道循环保护的反转为真:pos == N || a[pos] != 5
。在任何一种情况下,我们都有pos
我们想要的。
现在说我们在循环守卫中使用了<
,之后我们所知道的只有pos >= N || a[pos] != 5
,但这不是我们想要的情况。做了很多工作,我们可以证明我们不可能在pos > N
中,但与在循环保护中使用!=
相比,这样做会浪费时间。