3

相当简单,我想遍历一个数组的每个索引,arraysize只使用一个 var 进行循环。我有一种方法可以使用两个 varij,其中i跟踪实际索引并循环并j计数到 arraysize 并终止循环:

for (unsigned int i = start, j = 0; //start is the starting index
 j < arraysize;
 ++i == arraysize ? i = 0 : 0, ++j)
{
 //do stuff
}

有没有一些漂亮的方法可以做到这一点i?如果出于某种原因向后迭代有意义,顺序并不重要。

澄清:我想从 to 循环startarraysize - 1然后从0to循环start - 1

4

6 回答 6

7

至少据我了解,您想遍历整个数组,但是您想从起点以外的地方开始,然后当您到达终点时,您想从头开始并继续前进,直到到达终点原来的起点。

假设这是正确的,这很容易:

for (size_t i=0; i<arraysize; i++)
    process(array[(i+start)%arraysize]);
于 2013-10-30T16:47:02.253 回答
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

现场演示

于 2013-10-30T16:54:53.190 回答
1
for ( i=start; i<start+arraysize; i++ ) {
    // do stuff with (i % arraysize) in place of i
}
于 2013-10-30T16:46:29.610 回答
1
for (size_t i = start; (i + 1) % arraysize != start: i = (i + 1) % arraysize)  { 
    // stuff
}
于 2013-10-30T16:52:38.553 回答
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]);
}
于 2013-10-30T16:50:22.717 回答
0

例如,您可以使用以下循环语句

for ( int i = start; i < arraysize + start; i++ )

在循环体内而不是我使用表达式 i % arraysize

于 2013-10-30T16:53:21.123 回答