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

时间:2009-05-18 20:22:59

标签: c++ arrays

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

array[]={1,2,3,4,5} 

并希望删除3并将其余部分移动,以便我有,

array[]={1,2,4,5}

如何以最少的代码进行此操作?

10 个答案:

答案 0 :(得分:28)

您只需要使用数组中的下一个值覆盖您要删除的内容,传播该更改,然后记住新结束的位置:

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

现在你的数组是{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

在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);

更一般地说,有std::remove_if

请注意,std::vector<int>的使用在这里可能更合适,因为它是一个“真正的”动态分配的大小调整数组。 (从某种意义上说,要求它size()反映被删除的元素。)

答案 1 :(得分: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--;

但是,在C ++中,最好使用std::vector

std::vector<int> array;
// initialize array...

// delete element at index 2
array.erase(array.begin() + 2);

答案 2 :(得分:10)

就移动元素而言,

std :: copy完成了这项工作:

 #include <algorithm>

 std::copy(array+3, array+5, array+2);

请注意,复制的前提条件是目标不得位于源范围内。范围重叠是允许的。

此外,由于数组在C ++中的工作方式,这不会“缩短”数组。它只是在其中转移元素。没有办法改变数组的大小,但如果你使用一个单独的整数来跟踪它的“大小”意味着你关心的部分的大小,那么你当然可以减少它。

因此,你最终得到的数组就好像用以下内容初始化:

int array[] = {1,2,4,5,5};

答案 3 :(得分:5)

你无法用数组实现你想要的。改为使用向量,并阅读std :: remove算法。类似的东西:

std::remove(array, array+5, 3)

将在您的阵列上工作,但它不会缩短它(为什么 - 因为它是不可能的)。有了向量,它就像是

v.erase(std::remove(v.begin(), v.end(), 3), v.end())

答案 4 :(得分:3)

根据您的要求,您可能希望将stl列表用于这些类型的操作。您可以遍历列表,直到找到元素,然后擦除元素。如果你不能使用列表,那么你必须自己移动一切,无论是通过某种stl算法还是手动。

答案 5 :(得分:1)

如果您最关心代码大小和/或性能(也适用于WCET分析,如果您需要),我认为这可能是更透明的解决方案之一(用于查找和删除元素):< / p>

unsigned int l=0, removed=0;

for( unsigned int i=0; i<count; i++ ) {
    if( array[i] != to_remove )
        array[l++] = array[i];
    else
        removed++;
}

count -= removed;

答案 6 :(得分:1)

请注意:如果放宽保留元素顺序的要求,则用最后一个元素替换要删除的元素会更有效。

答案 7 :(得分:0)

Programming Hub 随机提供了一个代码片段,实际上确实可以减少数组的长度

for (i = position_to_remove; i < length_of_array; ++i) {
        inputarray[i] = inputarray[i + 1];
}

不确定是不是以后才添加的行为。它可以解决问题。

答案 8 :(得分:0)

它确实减少了长度。但是,如果我们谈论 int 数组,lengthsize 之间是有区别的。 大小告诉我们给定数组的容量,我们可以在其中存储多少。 数组的长度告诉我们实际上有多少项。

答案 9 :(得分:0)

这个问题有点老了。 尝试使用标准库提供的容器。这些都是由专家设计的,并且经过了很好的测试。此外,标准库算法的未来发展旨在适应这些标准库容器。

如果由于某种原因您必须坚持使用数组,请尝试使用 std::array

std::array<int, 5> array = { 1,2,3,4,5 };

//std::remove - The elements that are not deleted are moved to the front of the array,
//and returns the iterator of the element from where it can be completely erased.
auto itr = std::remove(array.begin(), array.end(), 3);

//New array with new size
std::array<int,4> newArray;

std::copy(array.begin(), itr, newArray.begin());

同样的事情也可以使用 std::array 来完成。但正如前面所说,许多其他好处更喜欢使用 std::array

int array[] = { 1,2,3,4,5 };    
auto itr = std::remove(std::begin(array), std::end(array), 3);    
int newArray[4];    
std::copy(std::begin(array), itr, std::begin(newArray));