2014-10-27 107 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) { 
    //... 
} 

周期的身体没有任何操作。