C ++负数组索引

时间:2014-09-17 14:47:17

标签: c++ arrays multidimensional-array

我想循环一个数组,然后在每个循环中我想在前面的5个元素上向后循环。

所以给定这个数组

 int arr[24]={3, 1, 4, 1, 7, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8, 4, 6, 2, 6, 4}

和这个嵌套循环

 for(int i=0;i<arr.size;i++)
 {
      for(int h=i-5; h<i; h++)
      {
        //things happen
      }
 }

因此,如果i = 0,则第二个循环将循环最后几个元素4,6,2,6,5。 你怎么能处理这个?

6 个答案:

答案 0 :(得分:3)

我假设:

  • 您只想查看之前的值(即没有环绕)你
  • 您实际上并不希望arr成为建议的多维数组 通过您选择的标签
  • 您希望在五个值中包含当前i

这只是对您的代码的一个小修改(我认为)你会问:

#include <math>
int main()
{
   int arr[24]={3, 1, 4, 1, 7, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8, 4, 6, 2, 6, 4}

   for(int i=0;i<arr.size;i++)
   {
     for(int h = max(i-4, 0); h < i+1; h++)
     {
        //things happen
     }
   }
}

注意h = max(i-4, 0)h < i+1这将减少内部循环的迭代次数,使其从索引0开始,并循环到五个值,直至并包括{ {1}}。 (四个值和i)。 i将永远在范围内 h在内部循环中不会出现问题的情况,因为外部循环将在发生之前终止(i==arr.size始终在边界内)。

编辑:我看到了这条评论:

  

我希望第一个元素考虑数组的最后5个元素。

在这种情况下,您的循环应如下所示:

i

这应该做你想要的:

for(int i=0;i<arr.size;i++) { for(int h=0; h<5; h++) { int index = (i + arr.size - h) % arr.size; //things happen //access array with arr[index]; } } i=0, h=0index=(0+24-0)%24时。对于0,我们减去一个h=1,依此类推,以获得index=(0+24-1)%24 = 23的下一个值。
代码获取最后5个值,包裹循环,包括当前值。 (h20,21,22,23,0i=021,22,23,0,1

如果你想要五个非包容性,那么内循环应该是:

i=1

这是循环的当前输出:

for(int h=1; h<=5; h++)

答案 1 :(得分:2)

我认为你想要它循环(不知道为什么)。如果是这样,请使用modulo:

int index = (h + arr.size) % arr.size;

答案 2 :(得分:1)

使用模运算符。

for (int i = 0; i < arr.size; i++)
{
  for (int h = 5; h > 0; h--)
  {
    const int array_length = sizeof(arr) / sizeof(arr[0]);
    int index = (i - h + array_length) % array_length; // Use 'sizeof(arr) / sizeof(arr[0])' to get the size of the array

    //things happen
  }
}

答案 3 :(得分:0)

使用if语句不是一个选项吗?

const int array_size = 24;
int arr[array_size] = { 1,3,4,5,...,2 }

 for(int i=0;i<array_size;i++)
 {
      for(int h=i-5; h<i; h++)
      {
        int arr_index = (h >= 0) ? h : (array_size + h);
         //do your things with arr[arr_index]
      }
 }

答案 4 :(得分:-1)

您也可以使用以下内容启动嵌套循环:

for(int h=i-min(i,5);h<i;++h)
{
}

允许您处理前5个单元格。此外,如果您正在处理某种信号或图像处理,请考虑将arr扩展为具有前5个零的29个元素或任何适合的值,并使用第5个元素启动第一个for循环。

答案 5 :(得分:-2)

只需在嵌套循环中创建一个if语句。像这样的东西

for( int h = i-5; h < i; h++ )
{
   // do stuff        
   if( i == 0 )
        break;
}