Wystarczy nadpisać co usuwasz z kolejnej wartości w tablicy, propagować tę zmianę, a następnie pamiętać, gdzie nowy końcowy jest:
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
Teraz twoja tablica jest {1, 2, 4, 5, 6, 7, 8, 9, 9}
. Nie można usunąć dodatkowego 9
, ponieważ jest to macierz o wielkości statystycznej, wystarczy ją zignorować. Można to zrobić z 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, zastosowanie może wykorzystywać std::move
(przeciążenia algorytm nie przeciążenia) zamiast narzędzie.
Bardziej ogólnie, należy std::remove
do usunięcia elementów pasujących wartość:
// remove *all* 3's, return new ending (remaining elements unspecified)
auto arrayEnd = std::remove(std::begin(array), std::end(array), 3);
Jeszcze bardziej ogólnie, istnieje std::remove_if
.
Należy pamiętać, że użycie tutaj std::vector<int>
może być bardziej odpowiednie, ponieważ jest to "prawdziwa" dynamicznie przydzielana tablica rozmiarów. (W tym sensie, że prośba o jego size()
odzwierciedla usunięte elementy.)
brak wzmianki o 'copy (iter, iter, iter)' lub 'move (iter, iter, iter)'? –
@MooingDuck: Powrót w ruchu '09 '(iter, iter, iter) 'nie istniało. : P Steve Jessop wspomina o tym poniżej, byłoby to (były) kradzież, aby umieścić to w mojej odpowiedzi, imo. – GManNickG
@GManNickG: kradnij - szczególnie na stare pytania Myślę, że ideałem jest, aby zaakceptowana odpowiedź była dobra. Czasem jest trochę bezczelnie napisać odpowiedź, która zawiera wszystkie najlepsze odpowiedzi na wszystkie inne pytania, ale jestem pewien, że jest to jednak zatwierdzona praktyka, ISTR często poleca to. Wszystko, czego nie chcę, żebyś użył, nie będę wysyłał do SO :-) –