for (int i = 0 ; i < stlVector.size() ; i++)
{
if (i == 10)
{
stlVector.erase(stlVector.begin() + 5 )
}
}
终止条件部分“stlVector.size()”是否采用“stlVector.erase(...)” 考虑?换句话说,每次循环迭代都会刷新stlVector.size()吗? 我现在无法测试,所以我在这里发了一个问题。
提前谢谢!致以最诚挚的问候,
zhengtonic
答案 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