在任何位置迭代完整数组,只使用一个变量

时间:2013-10-30 16:42:11

标签: c++ algorithm

相当简单,我想循环遍历arraysize数组的每个索引,只使用一个var作为循环。我有办法使用两个变量ij,其中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

6 个答案:

答案 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

Live Demo

答案 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

中使用表达式