移动数组中的整个块
Shift a whole block in an array
我想知道是否可以移动数组中的整个块。我打算删除动态长度数组中的一个项目,删除它之后,我希望整个块向右移动。到目前为止,我逐个元素地执行此操作,但这效率不高。所以想知道有没有更好的解决办法
重要:元素的顺序需要保持一致。
您可以使用链表代替数组。在链表中删除很容易。你只需要指向下一个下一个元素。
使用 memmove
可能比逐个元素复制更有效,因为这样你就可以利用你正在进行批量移动而不是大量小移动的事实(编译器通常提供高度优化的 memmove
实现),仅此而已。您需要 移动内存中的所有内容,因此您将不得不移动它。
如果您经常对数组执行此操作,则可能意味着您需要不同的数据结构。
使用环形缓冲区,像这样:
unsigned idx;
int Buf[1024];
void EnterValue(int value)
{
idx++;
Buf[idx & 1023] = value;
}
int GetOldValue(unsigned age)
{
assert(age<1024);
return Buf[ (idx-age) & 1023 ];
}
我想知道是否可以移动数组中的整个块。我打算删除动态长度数组中的一个项目,删除它之后,我希望整个块向右移动。到目前为止,我逐个元素地执行此操作,但这效率不高。所以想知道有没有更好的解决办法
重要:元素的顺序需要保持一致。
您可以使用链表代替数组。在链表中删除很容易。你只需要指向下一个下一个元素。
使用 memmove
可能比逐个元素复制更有效,因为这样你就可以利用你正在进行批量移动而不是大量小移动的事实(编译器通常提供高度优化的 memmove
实现),仅此而已。您需要 移动内存中的所有内容,因此您将不得不移动它。
如果您经常对数组执行此操作,则可能意味着您需要不同的数据结构。
使用环形缓冲区,像这样:
unsigned idx;
int Buf[1024];
void EnterValue(int value)
{
idx++;
Buf[idx & 1023] = value;
}
int GetOldValue(unsigned age)
{
assert(age<1024);
return Buf[ (idx-age) & 1023 ];
}