最近我正在阅读一本编程书,发现了这个问题:
我有一个数组:
array = [2,3,6,7,8,9,33,22];
现在,假设我删除了4th
位置的元素,即8
。
现在我必须将数组重新排列为:
Newarray = [2,3,6,7,9,33,22];
我该怎么做?我还必须尽量减少复杂性。
编辑我别无选择再制作它。我只需修改它。
答案 0 :(得分:2)
您可以通过简单地通过下一个元素复制元素来“删除”数组中的值,这对memmove
很容易:
int array[8] = {2,3,6,7,8,9,33,22};
memmove(&array[4], &array[5], sizeof(int) * 3);
结果数组为{2,3,6,7,9,33,22,22}
。
从中您可以看到尝试从编译时数组中“删除”元素时遇到的一个大问题: 无法 !
您可以覆盖元素,但数组的大小在编译时是固定的,并且在运行时实际上无法更改。
一种常见的解决方案是手动跟踪数组中有效元素的实际数量,并确保在添加或删除元素时更新该大小。或者将未使用的元素设置为不会被使用的值(例如,如果您的数组只能包含正数,那么您可以将未使用的元素设置为-1
并检查)。
如果你不想使用库函数(为什么不?),那么循环并设置例如。
array[4] = array[5];
array[5] = array[6];
等等。
答案 1 :(得分:1)
这样做,只需使用这两个功能就可以正常使用
index=4;//You wanted to delete it from the array.
memcpy(newarray,array,sizeof(array));
memmove(&newarray[index], &newarray[index + 1], sizeof(newarray)-1);
现在newarray
包含您确切的副本而没有您想删除的字符
答案 2 :(得分:1)
您可以简单地将delIdx(删除索引)中的每个元素向前移一步。
for(int i=delIdx; i<(arr_size-1);i++)
{
arr[i]= arr[i+1];
}
如果需要,您可以将最后一个元素设置为不可达到的值,或者减小数组的大小。