VC ++ 6中'for循环'的终止条件是否刷新?

时间:2009-02-12 16:08:32

标签: c++ visual-c++ for-loop vc6 termination

for (int i = 0 ; i < stlVector.size() ; i++)
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
}

终止条件部分“stlVector.size()”是否采用“stlVector.erase(...)” 考虑?换句话说,每次循环迭代都会刷新stlVector.size()吗? 我现在无法测试,所以我在这里发了一个问题。

提前谢谢!

致以最诚挚的问候,

zhengtonic

9 个答案:

答案 0 :(得分:5)

为了清楚起见,不要在循环刷新任何东西方面考虑它。每次检查条件时(在每次循环开始时),都会在stlVector变量上调用size()方法,并返回向量的当前大小。

erase()方法减小了向量的大小,因此下次调用size()时,返回的值会更小。

答案 1 :(得分:4)

是的确如此!

stlVector.size () // is called for evey iteration

因此,对于每个循环,您将获得测试“i&lt; stlVector.size()”重新评估!

答案 2 :(得分:4)

是的,每个循环都会进行测试并产生副作用。

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++;
}

- 亚当

答案 3 :(得分:2)

是的,确实如此,但不要这样做!如果要从向量中删除元素,请在另一个循环中执行。在这种情况下,您正在删除i索引之后的元素:没有任何保证stlVector [i + 5]元素存在。如果从向量中删除第i个元素,则计数会被破坏,因为您可以跳转元素而不检查它们。

最安全的方法是在stlVector上存储要在另一个向量上删除的元素的引用,然后在执行stlVector.erase(auxVector [i])的辅助向量上进行迭代。

答案 4 :(得分:2)

我希望你提供的代码只是“幻想代码”(正如一位评论者所说),给出了你想要做的事情类型的具体例子。

但是,如果它不是:你给出的循环将跳过第12个元素(即最初在stlVector[11]中的元素),因为在检查stlVector[10]时你删除了较早的元素,导致所有后来的元素向前分流一个位置,但在循环结束时仍然会增加i。因此,下一次迭代将查看stlVector[11],它实际上是stlVector[12]中最初的元素。要解决此问题,您需要在致电--i之后erase()

答案 5 :(得分:2)

始终重新评估!

答案 6 :(得分:1)

另外,为了澄清一点,因为你在“VC ++ 6”中询问它是否以这种方式完成。

在每个版本的C,C ++,C#和Java的每个循环中重新评估“continue condition”。

如果任何编译器没有生成执行此操作的代码,则该代码将被破坏,并且必须可以避免。

答案 7 :(得分:1)

正如其他人所说,是的,每次循环都会重新评估条件。这就是常见性能优化的原因:

int saveSize = someExpensiveComputation();

for (int i = 0 ; i < saveSize ; i++)
{ 
    foo(i);
}

其中循环条件的计算成本非常高,而不是

for (int i = 0 ; i < someExpensiveComputation(); i++)
{ 
    foo(i);
}

通过循环每次迭代都会不必要地进行昂贵的计算。

答案 8 :(得分:0)

是的,它减小了尺寸。更多信息是here