如何删除数组元素并将其余元素向下移动.所以,如果我有一个数组,
array[]={1,2,3,4,5}
Run Code Online (Sandbox Code Playgroud)
并且想要删除3并将其余部分移动,所以我有,
array[]={1,2,4,5}
Run Code Online (Sandbox Code Playgroud)
如何以最少的代码进行此操作?
GMa*_*ckG 30
您只需要使用数组中的下一个值覆盖要删除的内容,传播该更改,然后记住新结束的位置:
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// delete 3 (index 2)
for (int i = 2; i < 8; ++i)
array[i] = array[i + 1]; // copy next element left
Run Code Online (Sandbox Code Playgroud)
现在你的阵列是{1, 2, 4, 5, 6, 7, 8, 9, 9}.你不能删除额外的,9因为这是一个静态大小的数组,你只需要忽略它.这可以通过以下方式完成std::copy:
std::copy(array + 3, // copy everything starting here
array + 9, // and ending here, not including it,
array + 2) // to this destination
Run Code Online (Sandbox Code Playgroud)
在C++ 11中,使用可以使用std::move(算法重载,而不是实用程序重载).
更一般地,用于std::remove删除与值匹配的元素:
// remove *all* 3's, return new ending (remaining elements unspecified)
auto arrayEnd = std::remove(std::begin(array), std::end(array), 3);
Run Code Online (Sandbox Code Playgroud)
更普遍的是,有std::remove_if.
注意,这里的使用std::vector<int>可能更合适,因为它是一个"真正的"动态分配的大小调整数组.(从某种意义上说,要求它size()反映被删除的元素.)
Ada*_*eld 21
您可以使用memmove(),但您必须自己跟踪数组大小:
size_t array_size = 5;
int array[5] = {1, 2, 3, 4, 5};
// delete element at index 2
memmove(array + 2, array + 3, (array_size - 2 - 1) * sizeof(int));
array_size--;
Run Code Online (Sandbox Code Playgroud)
但是,在C++中,最好使用std::vector:
std::vector<int> array;
// initialize array...
// delete element at index 2
array.erase(array.begin() + 2);
Run Code Online (Sandbox Code Playgroud)
Ste*_*sop 10
就移动元素而言,std :: copy完成了这项工作:
#include <algorithm>
std::copy(array+3, array+5, array+2);
Run Code Online (Sandbox Code Playgroud)
请注意,复制的前提条件是目标不能位于源范围内.允许范围重叠.
此外,由于数组在C++中的工作方式,这不会"缩短"数组.它只是在其中转移元素.没有办法改变数组的大小,但如果你使用一个单独的整数来跟踪它的"大小"意味着你关心的部分的大小,那么你当然可以减少它.
因此,您最终得到的数组就好像它是用以下内容初始化的:
int array[] = {1,2,4,5,5};
Run Code Online (Sandbox Code Playgroud)
你不能用数组实现你想要的.改为使用向量,并阅读std :: remove算法.就像是:
std::remove(array, array+5, 3)
Run Code Online (Sandbox Code Playgroud)
将在您的阵列上工作,但它不会缩短它(为什么 - 因为它是不可能的).对于矢量,它就像是
v.erase(std::remove(v.begin(), v.end(), 3), v.end())
Run Code Online (Sandbox Code Playgroud)