将for循环递增1然后递增2

时间:2014-10-27 10:40:28

标签: c++ for-loop increment

我需要将for循环增加1,然后增加2,然后在此循环中增加1。我有办法做到但我不喜欢它。有没有人有更好的'实施比这个:

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

语言是c ++

5 个答案:

答案 0 :(得分:2)

试试这个:

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

周期中没有任何操作。

答案 1 :(得分:2)

这个问题有一个公认的答案,但是没有人提到这个,所以我想我会添加一个额外的答案:

通过选择2-1-2-1-2-1-2-1步骤获得的索引是:

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

您可以很容易地看到每个第三个索引都缺失,从1开始。最简单的方法是写这个(&#34;最简单的&#34; =&#34;对于开发人员来说最清楚,以后&#34; )将是:

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

此处没有额外的步骤变量,虽然您也迭代了跳过的索引,但迭代对性能无关紧要,除非您正在查看性能关键代码。

答案 2 :(得分:1)

我会像这样做清楚的事情

  int i = 0;
  bool twice = false;

  while (i < m) {

    // code here                                                                

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

答案 3 :(得分: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)
}

这样,您不需要额外的计算开销来计算循环索引的增量

答案 4 :(得分:0)

嗯,我想你可以让它变得更加整洁:

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

当然它不是最具可读性的,它需要一些评论,但它很短