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

use*_*342 3 c++ algorithm

相当简单,我想循环遍历一个数组的每个索引,arraysize只使用一个var作为循环.我有办法有两个瓦尔做ij,其中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
}
Run Code Online (Sandbox Code Playgroud)

只有一些漂亮的方法来做到这一点i吗?如果由于某种原因后向迭代是有意义的,顺序无关紧要.

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

Jer*_*fin 7

至少根据我的理解,你想要遍历整个阵列,但是你想要从开头以外的某个地方开始,然后当你到达终点时,你想要从头开始并继续前进直到你到达原始起点.

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

for (size_t i=0; i<arraysize; i++)
    process(array[(i+start)%arraysize]);
Run Code Online (Sandbox Code Playgroud)


Evg*_*yuk 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;
    });
}
Run Code Online (Sandbox Code Playgroud)

输出是:

6
24
1
1
2
Run Code Online (Sandbox Code Playgroud)

现场演示