2012-08-30 2 views
1

중첩 루프에서 한 번만 수행 할 수있는 가장 현명한 방법은 무엇입니까? 외부 루프가 매우 복잡하기 때문에 불변 부분을 추출 할 수 없습니다. 이 방법은 매우 자주 tree.cycle이 증가 될 때까지라고중첩 루프/루프 불변 형에서 한 번만 확인하십시오.

void foo::bar() { 
    if(oldCycle == tree.cycle) { 
     doSomething(); 
     oldCycle++; 
    } 
} 

: 은 여기 내 C++ 예입니다. oldCycle는 foo는

claas foo { 
public: ... 

private: 
int oldCycle; 
}; 

의 개인 멤버 변수가이 코드를 컴파일러 최적화를 않거나 것이다 체크 실행하면 모든 반복인가?

편집 : 루프와 함께 코드를 요청한 것처럼 : 첫 번째 루프가 mexFunction() 메소드에 있고, 알고리즘이 matlab에서 시작되고 mexFunction을 호출합니다.

void mexFunction(...) { 
    for(tree.cycle = 0; tree.cycle<maxIt; tree.cycle++) { 
     foo->startfoo(); 
    } 
} 

여기에 다른 루프입니다 : 당신이 컬렉션에 어떤 식 으로든에서 특별한 경우를 제거해야하기 때문에 일반적인 조건에 대한

void foo::startfoo() { 
    for(tree.cur_it = 0; tree.cur_it <=39; tree.cur_it++) { 
     bar(); 
    } 
} 
+1

무엇을 의미합니까? 정상적인 루프에서 모든 것은 반복마다 한 번만 발생합니다. 어느 예제도 * 단일 루프를 표시하지 않습니다. 당신이 요구하는 것을 보여주십시오. – jalf

+0

'tree.cycle'이 때때로 바뀌기 때문에 최적화를 할 수있는 방법이 없습니다. 이 변경이 발생했을 때 플래그를 설정하면 플래그를 확인해야하므로 아무 것도 얻지 못합니다. – Gorpik

답변

3

, 당신은 정말이를 최적화 할 수 있습니다 다른.

그러나, 특별히 요소를 치료하는 특별한 경우에, 당신은 크 누스의 "루프 반"를 사용할 수 있습니다 (예 드 ­ 리 ­ MIT "1, 2, 3"으로 ­ ERS와 범위를 인쇄 할 때) :

나이브 루프 :

for (unsigned int i = 0; i != values.size(); ++i) 
{ 
    if (i != 0) { std::cout << ", "; } 
    std::cout << values[i]; 
} 

루프 반 :

,
if (!values.empty()) 
{ 
    for (unsigned int i = 0; ;) 
    { 
     std::cout << values[i]; 
     ++i; 
     if (i == values.size()) { break; } 
     std::cout << ", "; 
    } 
} 

후자의 구성이 더 복잡하지만 대부분 거짓 체크 i != 0을 저장합니다.

즉, 코드를 순진한 방법으로 작성하더라도 훌륭한 컴파일러가 부분적으로 언 롤링을 수행한다는 것은 매우 합리적입니다.

0

간단한 방법으로 나는이 방법을 선호합니다.

if (! values.empty()) 
{ 
    std::cout << values[0]; 

    for (size_t z = 1; z < values.size(); z++) 
    { 
     std::cout << ", " << values[z]; 
    } 
}