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]的元素。为了解决这个问题,你需要调用--ierase()

始终重新评估肯定!

另外,澄清了一下,既然你问,如果它这样做的方式“在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);
}

当昂贵的计算是不必要通过循环完成每一次迭代。

是它减少了尺寸。详细信息是这里

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top