[英]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.