Вам просто нужно переписать то, что вы удаляете, следующим значением в массиве, распространить это изменение, а затем иметь в виду, где новый конец:
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()
отражает удаленные элементы.)