문제

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

고가의 계산이 루프를 통해 각 반복을 불필요하게 수행하는 경우.

예, 크기를 줄입니다. 더 많은 정보는입니다 여기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top