繁体   English   中英

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

[英]increment a for loop by 1 then by 2

我需要在此循环中将for循环依次递增1、2、1。 我有一种方法可以做到,但是我不喜欢它。 没有人有比这更“更聪明”的实现:

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

语言是c ++

尝试这个:

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

循环体内没有任何操作。

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

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

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

您可以很容易地看到,从1开始,每三个索引都丢失了。最简单的写法(“ easiest” =“以后最容易为开发人员阅读”)将是:

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

这里没有额外的step变量,尽管您也要对跳过的索引进行迭代,但是迭代对性能并不重要,除非您正在查看对性能至关重要的代码。

我会这样说清楚

  int i = 0;
  bool twice = false;

  while (i < m) {

    // code here                                                                

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

我认为一个非常简单的解决方案是展开循环:

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)
}

这样,您无需添加额外的计算开销即可计算循环索引的增量

好吧,我想您可以像这样使它更加简洁:

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

当然,它不是最易读的,它需要一些注释,但是很短

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM