vc ++ 6에서 '루프'를 위해 'for loop'의 종료 조건이 있습니까?
-
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
해결책
분명히 말해서, 루프가 상쾌하게 상쾌하게 생각하지 마십시오. 조건이 검사 될 때마다 (루프를 통해 매번 시작할 때) size () 메소드가 stlvector 변수에서 호출되고 벡터의 현재 크기가 반환됩니다.
Erase () 메소드는 벡터의 크기를 줄이므로 다음에 size ()가 호출되면 반환 된 값은 더 작습니다.
다른 팁
네, 그렇습니다!
stlVector.size () // is called for evey iteration
따라서 모든 루프에 대해 "i <stlvector.size ()"테스트가 다시 평가됩니다!
예, 테스트는 각 루프에 대해 부작용으로 수행됩니다.
for 루프는 단지 멋진 컨벤션 일뿐입니다 - 루프를위한 a는 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++;
}
-아담
그렇습니다.하지만 그렇게하지 마십시오! 벡터에서 요소를 제거하려면 다른 루프 내부에서 수행하십시오. 이 경우 I 인덱스 후 요소를 삭제하고 있습니다. 벡터에서 I-TH 요소를 제거하면 요소를 확인하지 않고 점프 할 수 있기 때문에 카운트가 고장납니다.
이 작업을 수행하는 가장 안전한 방법은 다른 벡터에서 삭제하려는 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);
}
고가의 계산이 루프를 통해 각 반복을 불필요하게 수행하는 경우.
예, 크기를 줄입니다. 더 많은 정보는입니다 여기