我需要在此循環中將for循環加1,然後減2,然後減1。我有一個方法來做到這一點,但我不喜歡它。有沒有人有一個「更好」的實現比這將循環增加1,然後增加2
int value= 2;
int changeValue=1;
for(int i=0;i<m;i+=value){
value+=(changeValue*-1);
}
的語言是C++
我需要在此循環中將for循環加1,然後減2,然後減1。我有一個方法來做到這一點,但我不喜歡它。有沒有人有一個「更好」的實現比這將循環增加1,然後增加2
int value= 2;
int changeValue=1;
for(int i=0;i<m;i+=value){
value+=(changeValue*-1);
}
的語言是C++
的問題有一個公認的答案,但沒有人提到這一點,所以我想我會增加額外的響應:
你選擇一個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
}
這裏沒有額外的步驟變量,雖然您也爲跳過的索引進行迭代,但除非您正在查看性能嚴重的代碼,否則迭代對性能無關緊要。
簡單而有效。循環遍歷所有內容,但不要對這些行爲採取行動:...使循環簡單化,而guard子句是一種常見的設計模式。我認爲即使對性能至關重要的代碼,優化和分支預測(2對1關閉也很簡單,可以覆蓋),應該可以處理這個以及任何其他方法,但性能不會有任何問題。 – Baldrickk 2014-10-27 12:00:23
我會做一些明確這樣
int i = 0;
bool twice = false;
while (i < m) {
// code here
if (!twice) {
twice = true;
i++;
} else {
twice = false;
i += 2;
}
}
嗯,我想你可以把它一點點更像這樣整齊:
int j = 0;
for(int i = 0; i < m; i += j++ % 2 == 0 ? 2 : 1) {
//
}
當然這不是最可讀的,它需要一點點mment左右,但它是在我看來,短期
一個非常簡單的解決辦法是展開循環:
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)
}
這樣,你沒有增加任何額外的計算開銷計算環路索引的增量
試試這個:
for (int i = 0, j = 0; i < m; i += (j++ % 2) + 1) {
//...
}
週期的身體沒有任何操作。
語言是C++ – user3545967 2014-10-27 10:48:54