Sie müssen nur überschreiben, was Sie mit dem nächsten Wert in dem Array sind zu löschen, propagieren diese Änderung, und dann im Auge behalten, wo das neue Ende ist:
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
Jetzt Ihr Array ist {1, 2, 4, 5, 6, 7, 8, 9, 9}
. Sie können die zusätzliche 9
nicht löschen, da dies ein Array statischer Größe ist, Sie müssen es nur ignorieren. Dies kann mit std::copy
erfolgen:
std::copy(array + 3, // copy everything starting here
array + 9, // and ending here, not including it,
array + 2) // to this destination
In C++ 11, Verwendung std::move
(der Algorithmus Überlastung, nicht das Dienstprogramm Überlastung) verwenden kann, statt.
Allgemeiner verwenden std::remove
Elemente zu entfernen, um einen Wert übereinstimmt, gefunden
// remove *all* 3's, return new ending (remaining elements unspecified)
auto arrayEnd = std::remove(std::begin(array), std::end(array), 3);
Noch mehr im Allgemeinen, es std::remove_if
ist.
Beachten Sie, dass die Verwendung von std::vector<int>
hier möglicherweise besser geeignet ist, da es sich um ein "echtes" dynamisch zugewiesenes Größenanpassungs-Array handelt. (In dem Sinne, dass die Frage nach seinem size()
spiegelt entfernte Elemente.)
keine Erwähnung von 'copy (iter, iter, iter)' 'oder' move (iter, iter, iter) ''? –
@MooingDuck: Zurück in '09 'move (iter, iter, iter)' existierte nicht. : P Steve Jessop erwähnt es unten, es wäre (hätte) gestohlen, um es in meine Antwort zu stecken, imo. – GManNickG
@GManNickG: stehlen weg - vor allem für alte Fragen Ich denke, das Ideal ist, dass die angenommene Antwort gut ist. Manchmal ist es ein bisschen frech, eine Antwort zu schreiben, die alle die besten Teile der Antworten des anderen birgt, aber ich bin mir ziemlich sicher, dass es dennoch eine anerkannte Praxis ist, ISTR eine FAQ, die es eigentlich empfiehlt. Alles, was ich nicht benutzen möchte, werde ich nicht bei SO posten :-) –