删除一个数组元素并移动剩余的数组元素

use*_*572 19 c++ arrays

如何删除数组元素并将其余元素向下移动.所以,如果我有一个数组,

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()反映被删除的元素.)

  • @MooingDuck:早在 09 年 `move(iter, iter,iter)` 还不存在。:P 史蒂夫·杰索普在下面提到了这一点,在我看来,将其放入我的答案中将是(一直)偷窃。 (2认同)

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)

  • 请注意,memmove() 仅适用于 POD 类型,而 OTOH 几乎任何类型都可以与向量一起使用,即使是那些具有用户定义的 operator=() 的类型。 (2认同)

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)


zvr*_*rba 5

你不能用数组实现你想要的.改为使用向量,并阅读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)