我想循环一个数组,然后在每个循环中我想在前面的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。 你怎么能处理这个?
答案 0 :(得分:3)
我假设:
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=0
为index=(0+24-0)%24
时。对于0
,我们减去一个h=1
,依此类推,以获得index=(0+24-1)%24 = 23
的下一个值。
代码获取最后5个值,包裹循环,包括当前值。 (h
时20,21,22,23,0
,i=0
时21,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;
}