我有一个大数组,并且有许多操作循环遍历它的最后N个元素,其中N在每种情况下都是不同的。每个都有一个索引变量,每个索引都以不规则的间隔更新,此时它的位置增加一个元素。 (该数组是一个音频缓冲区,操作正在复制它的不同部分以输出)。
因此不可能使用正常的循环结构。
以前,我循环遍历整个数组,因此每次更新索引时,我都可以使用数组长度的mod操作简单地测试其值,并在必要时重置。我认为我需要类似的东西,但要将索引重置为(array_size - N),而不是归零。
我确信这有一个简单的解决方案 - 对不起,如果我错过了那么明显的问题!
答案 0 :(得分:3)
// loop over last N
sometype array[maxsize];
for (sometype* p = array + maxsize - N; p < array + maxsize; ++p)
{
...
}
答案 1 :(得分:1)
for( unsigned int i = std::max( 0u, array.size() - N ); i < array.size(); ++i )
答案 2 :(得分:1)
从最后开始的for
循环怎么样,例如:
for ( int i = array_size; (i >= 0) && (i >= (array_size - N)); i-- )
operation( array[i] );
除非我不能正确理解你的问题,否则你可能不需要这样的模运算符。
答案 3 :(得分:0)
如果您知道数组的长度,这很容易
int L=length;
int* array;
int* start=array+length-N;
for(i=0;i<N;i++){
doSomething( start[i] );
}
如果您正在寻找模运算符,请使用%
int i=0;
while(condition){
i++; i%=N; // increment i, modulo N
}