相当简单,我想循环遍历arraysize
数组的每个索引,只使用一个var作为循环。我有办法使用两个变量i
和j
,其中i
跟踪实际索引并循环并且j
计算到数组化并终止循环:
for (unsigned int i = start, j = 0; //start is the starting index
j < arraysize;
++i == arraysize ? i = 0 : 0, ++j)
{
//do stuff
}
只有i
有一些漂亮的方法吗?如果由于某种原因后向迭代是有意义的,顺序无关紧要。
澄清:我想从start
循环到arraysize - 1
,然后从0
循环到start - 1
。
答案 0 :(得分:7)
至少据我所知,你想循环遍历整个阵列,但是你想要从开头以外的某个地方开始,然后当你到达终点时,你想要重新开始在开始时继续前进,直到达到原始起点。
假设这是正确的,这很容易:
for (size_t i=0; i<arraysize; i++)
process(array[(i+start)%arraysize]);
答案 1 :(得分:5)
我更愿意将该算法抽象为泛型函数(甚至可以在std::forward_list
之类的函数上工作),而不需要执行多余的模运算和加法运算(尽管在许多情况下它们可能是可接受的):
#include <algorithm>
#include <iostream>
#include <iterator>
template<typename FwdIter, typename F>
F for_each_shifted(FwdIter first, FwdIter start, FwdIter last, F f)
{
using std::for_each;
return for_each(first, start, for_each(start, last, f));
}
int main()
{
using namespace std;
int v[] = { 1, 1, 2, 6, 24 };
for_each_shifted(begin(v), begin(v) + 3, end(v), [](int x)
{
cout << x << endl;
});
}
输出是:
6
24
1
1
2
答案 2 :(得分:1)
for ( i=start; i<start+arraysize; i++ ) {
// do stuff with (i % arraysize) in place of i
}
答案 3 :(得分:1)
for (size_t i = start; (i + 1) % arraysize != start: i = (i + 1) % arraysize) {
// stuff
}
答案 4 :(得分:0)
这会让你到那里:
for (unsigned int i = start; i < start + arraySize; i++)
{
DoSomething(array[i % arraySize]);
}
可替换地:
for (unsigned int i = 0; i < arraySize; i++)
{
DoSomething(array[(i + start) % arraySize]);
}
答案 5 :(得分:0)
例如,您可以使用以下循环语句
for ( int i = start; i < arraysize + start; i++ )
并且在循环体内而不是我在%array size
中使用表达式