【问题标题】:Iterate over full array starting at any position, using only one variable从任何位置开始迭代整个数组,只使用一个变量
【发布时间】:2013-10-30 16:42:11
【问题描述】:

相当简单,我想只使用一个 var 循环遍历 arraysize 数组的每个索引。我有一种方法可以使用两个变量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

【问题讨论】:

  • 我不明白 - i 这里的目的是什么?
  • 我不确定我能得到你需要的东西。是否要在大小为 arraysize 的数组上循环 arraysize 次?
  • 我认为他想从任意位置开始迭代所有元素。

标签: c++ algorithm


【解决方案1】:

至少据我了解,你想循环遍历整个数组,但是你想从头以外的地方开始,然后当你到达终点时,你想从头开始从头开始,一直走,直到到达原来的起点。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • +1。这是唯一能正确避免整数溢出的解决方案。
    【解决方案3】:
    for ( i=start; i<start+arraysize; i++ ) {
        // do stuff with (i % arraysize) in place of i
    }
    

    【讨论】:

      【解决方案4】:
      for (size_t i = start; (i + 1) % arraysize != start: i = (i + 1) % arraysize)  { 
          // stuff
      }
      

      【讨论】:

        【解决方案5】:

        这会让你到达那里:

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

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2015-01-20
            • 1970-01-01
            • 2019-07-26
            • 2015-10-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-09
            相关资源
            最近更新 更多