我需要在此循环中将for循环加1,然后减2,然后减1。我有一个方法来做到这一点,但我不喜欢它。有没有人有一个“更好”的实现比这将循环增加1,然后增加2
int value= 2;
int changeValue=1;
for(int i=0;i<m;i+=value){
value+=(changeValue*-1);
}
的语言是C++
我需要在此循环中将for循环加1,然后减2,然后减1。我有一个方法来做到这一点,但我不喜欢它。有没有人有一个“更好”的实现比这将循环增加1,然后增加2
int value= 2;
int changeValue=1;
for(int i=0;i<m;i+=value){
value+=(changeValue*-1);
}
的语言是C++
的问题有一个公认的答案,但没有人提到这一点,所以我想我会增加额外的响应:
你选择一个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
}
这里没有额外的步骤变量,虽然您也为跳过的索引进行迭代,但除非您正在查看性能严重的代码,否则迭代对性能无关紧要。
简单而有效。循环遍历所有内容,但不要对这些行为采取行动:...使循环简单化,而guard子句是一种常见的设计模式。我认为即使对性能至关重要的代码,优化和分支预测(2对1关闭也很简单,可以覆盖),应该可以处理这个以及任何其他方法,但性能不会有任何问题。 – Baldrickk 2014-10-27 12:00:23
我会做一些明确这样
int i = 0;
bool twice = false;
while (i < m) {
// code here
if (!twice) {
twice = true;
i++;
} else {
twice = false;
i += 2;
}
}
嗯,我想你可以把它一点点更像这样整齐:
int j = 0;
for(int i = 0; i < m; i += j++ % 2 == 0 ? 2 : 1) {
//
}
当然这不是最可读的,它需要一点点mment左右,但它是在我看来,短期
一个非常简单的解决办法是展开循环:
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)
}
这样,你没有增加任何额外的计算开销计算环路索引的增量
试试这个:
for (int i = 0, j = 0; i < m; i += (j++ % 2) + 1) {
//...
}
周期的身体没有任何操作。
语言是C++ – user3545967 2014-10-27 10:48:54