2014-10-27 31 views
0

我需要在此循環中將for循環加1,然後減2,然後減1。我有一個方法來做到這一點,但我不喜歡它。有沒有人有一個「更好」的實現比這將循環增加1,然後增加2

int value= 2; 
int changeValue=1; 
for(int i=0;i<m;i+=value){ 
    value+=(changeValue*-1); 
} 

的語言是C++

+0

語言是C++ – user3545967 2014-10-27 10:48:54

回答

2

的問題有一個公認的答案,但沒有人提到這一點,所以我想我會增加額外的響應:

你選擇一個2-1-2-1-2-1-2中得到的指標-1步驟是這些:

0, 2, 3, 5, 6, 8, 9, ... 

您可以很容易地看到每三個指標缺失,從1,最簡單的方式開始寫這篇文章(「最簡單的」 =「最清晰的閱讀爲開發,後來的」 )將是:

for(int i = 0; i < m; ++i){ 
    if(i % 3 == 1) 
     continue; 
    // handle rest of loop 
} 

這裏沒有額外的步驟變量,雖然您也爲跳過的索引進行迭代,但除非您正在查看性能嚴重的代碼,否則迭代對性能無關緊要。

+1

簡單而有效。循環遍歷所有內容,但不要對這些行爲採取行動:...使循環簡單化,而guard子句是一種常見的設計模式。我認爲即使對性能至關重要的代碼,優化和分支預測(2對1關閉也很簡單,可以覆蓋),應該可以處理這個以及任何其他方法,但性能不會有任何問題。 – Baldrickk 2014-10-27 12:00:23

1

我會做一些明確這樣

int i = 0; 
    bool twice = false; 

    while (i < m) { 

    // code here                 

    if (!twice) { 
     twice = true; 
     i++; 
    } else { 
     twice = false; 
     i += 2; 
    } 
    } 
0

嗯,我想你可以把它一點點更像這樣整齊:

int j = 0; 
for(int i = 0; i < m; i += j++ % 2 == 0 ? 2 : 1) { 
    // 
} 

當然這不是最可讀的,它需要一點點mment左右,但它是在我看來,短期

1

一個非常簡單的解決辦法是展開循環:

int value= 2; 
int changeValue=1; 
for(int i=0;i<m;i+=value){ 
    foo(i); 
    value+=(changeValue*-1); 
} 

變爲:

foo(0); 
for(int i=1;i<m;i+=3){ 
    foo(i); 
    foo(i+2) 
} 

這樣,你沒有增加任何額外的計算開銷計算環路索引的增量

2

試試這個:

for (int i = 0, j = 0; i < m; i += (j++ % 2) + 1) { 
    //... 
} 

週期的身體沒有任何操作。