2012-08-30 96 views
1

在嵌套循環中,每次迭代只執行一次最明智的方法是什麼?我不能拉出不變部分,因爲外部循環非常複雜。 這裏是我的C++例子:在嵌套循環/循環不變中檢查一次

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

這種方法被稱爲非常頻繁,直到tree.cycle遞增。 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

你是什麼意思?在正常的循環中,每次迭代只發生一次*。你的兩個例子都沒有顯示* single *循環。告訴我們你在問什麼。 – jalf

+0

如你所說,你無法優化這個檢查,因爲'tree.cycle'會不時變化。如果您在發生這種變化時設置了標誌,則必須檢查標誌,因此沒有任何結果。 – Gorpik

回答

3

對於一般的情況下,你不能真正優化了這一點,因爲你需要從集合的一種方式或刪除特殊情況另一個。

然而,專門治療第一元素的特殊情況(例如:打印與德­李­ MIT ­ ERS作爲"1, 2, 3"範圍時),你可以使用Knuth的「環和半」:

天真循環:

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