如何删除数组元素并将其余元素向下移动。所以,如果我有一个数组,
array[]={1,2,3,4,5}
并希望删除3并将其余部分移动,以便我有,
array[]={1,2,4,5}
如何以最少的代码进行此操作?
答案 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 数组,length 和 size 之间是有区别的。 大小告诉我们给定数组的容量,我们可以在其中存储多少。 数组的长度告诉我们实际上有多少项。
答案 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));