我需要将for循环增加1,然后增加2,然后在此循环中增加1。我有办法做到但我不喜欢它。有没有人有更好的'实施比这个:
int value= 2;
int changeValue=1;
for(int i=0;i<m;i+=value){
value+=(changeValue*-1);
}
语言是c ++
答案 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 ) {
//
}
当然它不是最具可读性的,它需要一些评论,但它很短