从任何位置开始迭代整个数组,仅使用一个变量

Iterate over full array starting at any position, using only one variable

本文关键字:变量 一个 位置 任何 开始 迭代 数组      更新时间:2023-10-16

相当简单,我想只使用一个var进行循环,遍历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
}

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

澄清:我想从start循环到arraysize - 1,然后从0循环到start - 1

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

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

for (size_t i=0; i<arraysize; i++)
    process(array[(i+start)%arraysize]);

我更愿意将该算法抽象为通用函数(甚至可以在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

现场演示

for ( i=start; i<start+arraysize; i++ ) {
    // do stuff with (i % arraysize) in place of i
}
for (size_t i = start; (i + 1) % arraysize != start: i = (i + 1) % arraysize)  { 
    // stuff
}

这会让你到达那里:

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]);
}

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

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

在循环体内部而不是我使用表达式 i % 数组大小

相关文章: