请问在VC ++ 6“的循环”刷新的终止条件?
-
23-08-2019 - |
题
for (int i = 0 ; i < stlVector.size() ; i++)
{
if (i == 10)
{
stlVector.erase(stlVector.begin() + 5 )
}
}
是否终止条件的一部分 “stlVector.size()” 取 “stlVector.erase(...)” 考虑吗?换句话说也stlVector.size()刷新每次循环? 我现在不能测试它,所以我在这里张贴的问题。
Thx提前!
最好的问候,
zhengtonic
解决方案
只是要清楚,不要在循环刷新什么的角度来考虑它。每次条件(通过循环在每个时间的开始)检查时间,尺寸()方法被调用的stlVector变量,并返回向量的当前大小。
擦除()方法降低了向量的大小,所以在下一次的大小()被调用时,则返回值将较小。
其他提示
是它!
stlVector.size () // is called for evey iteration
因此,对于每一个循环中,您将有测试 “I
是,则执行测试,具有副作用,对于每个循环。
一个for循环仅仅是一个很好的约定 - for循环容易分解为while循环:
for (int i = 0 ; i < stlVector.size() ; i++)
{
if (i == 10)
{
stlVector.erase(stlVector.begin() + 5 )
}
}
变为:
int i = 0 ;
while(i < stlVector.size())
{
if (i == 10)
{
stlVector.erase(stlVector.begin() + 5 )
}
i++;
}
- 亚当
是的,确实如此,但不这样做!如果你想从一个向量删除元素,这样做的另一循环内。你是在这种情况下,我索引后删除元素:没有什么保证了stlVector第[i + 5]的元素存在。如果从载体移除的第i个元素,您的计数被打破,因为你可以跳元件而不检查它们。
操作是存储用于对要删除的另一向量的stlVector的元素的引用,然后做stlVector.erase此附配矢量迭代的最安全的方式(auxVector [I])。
我希望你提供的代码仅仅是“幻想码”(如一个评论者把它)给你正在试图做的事情的类型的具体实例。
然而,以防万一它不是为的你给循环将跳过第12要素(即原来在stlVector[11]
元素),因为检查stlVector[10]
当你删除一个较早的元素,从而导致其随后所有的元素分流向前移动一个位置,但你仍然在循环的末尾增加i
。所以,下一次迭代将着眼于stlVector[11]
这实际上是最初在stlVector[12]
的元素。为了解决这个问题,你需要调用--i
后erase()
。
始终重新评估肯定!
另外,澄清了一下,既然你问,如果它这样做的方式“在VC ++ 6”。
“继续条件” 对每个版本C,C ++,C#和Java的每一个循环中被重新评估。
如果任何编译器不会生成代码这样做,它被打破,和必须的被避免。
正如其他人说,是条件是通过每次循环重新评估。这就是为什么一个常见的性能优化是:
int saveSize = someExpensiveComputation();
for (int i = 0 ; i < saveSize ; i++)
{
foo(i);
}
其中循环条件是在所有昂贵来计算,而不是
for (int i = 0 ; i < someExpensiveComputation(); i++)
{
foo(i);
}
当昂贵的计算是不必要通过循环完成每一次迭代。
是它减少了尺寸。详细信息是这里