„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Was ist der Unterschied zwischen „std::remove“ und „std::erase“ in C++?

Was ist der Unterschied zwischen „std::remove“ und „std::erase“ in C++?

Veröffentlicht am 11.11.2024
Durchsuche:133

 What\'s the Difference Between `std::remove` and `std::erase` in C  ?

Den Unterschied zwischen std::erase und std::remove verstehen

Der std::remove-Algorithmus ist ein vielseitiges Werkzeug, das für die Bedienung entwickelt wurde auf jedem Forward-Iterator-Paar, wodurch es auf eine Vielzahl von Containern und Szenarien anwendbar ist. Im Gegensatz zu seinem Gegenstück std::erase, das Elemente effektiv aus einem Container löscht und entfernt, ordnet std::remove nur Elemente neu an.

1. Aufdecken der Nuancen von std::remove

std::remove funktioniert durch die logische Partitionierung des Containers in zwei Abschnitte: einen Abschnitt mit den zu entfernenden Elementen und einen Abschnitt mit den verbleibenden Elementen. Dazu wird der Container durchlaufen und nicht entfernte Elemente nach vorne verschoben, wodurch entfernte Elemente effektiv überschrieben werden. Es ist jedoch wichtig zu beachten, dass std::remove die gelöschten Elemente nicht tatsächlich löscht; Sie bleiben im Speicher, sind aber praktisch nicht sichtbar.

Dieses Verhalten wird deutlich, wenn std::remove in Verbindung mit der Funktion „container size()“ verwendet wird. Nach dem Entfernen eines Elements mit std::remove gibt std::size() weiterhin die ursprüngliche Größe des Containers zurück, auch wenn einige Elemente logisch gelöscht werden. Die Größe des Containers ändert sich erst, nachdem std::erase verwendet wurde, um die ausgeblendeten Elemente physisch zu entfernen.

2. Visualisierung der Auswirkungen von std::remove

Betrachten Sie den in der ursprünglichen Frage bereitgestellten Codeausschnitt:

std::vector a;
a.push_back(1);
a.push_back(2);

std::remove(a.begin(), a.end(), 1);

int s = a.size();

Nach der Ausführung von std::remove enthält der Vektor noch zwei Elemente (2 und 2), aber das erste Element (1) wird logisch gelöscht und aus der Ansicht ausgeblendet. Daher gibt std::size() 2 zurück, obwohl ein verstecktes gelöschtes Element vorhanden ist.

3. Einsatz von std::erase zur physischen Entfernung

Um gelöschte Elemente physisch zu entfernen und die Größe des Containers zu aktualisieren, kommt std::erase ins Spiel. Durch Aufrufen von std::erase mit dem von std::remove zurückgegebenen Iteratorpaar als erstem Argument können Sie die ausgeblendeten gelöschten Elemente entfernen und die Größe des Containers reduzieren:

a.erase(std::remove(a.begin(), a.end(), 1), a.end());

In diesem Fall entfernt std::erase das Element physisch 1, wobei der Vektor ein einzelnes Element (2) und eine aktualisierte Größe von 1 hinterlässt.

4. Den Umfang des Dienstprogramms von std::remove verstehen

Während std::remove nicht nur für die Verwendung in Verbindung mit std::erase konzipiert ist, findet es in verschiedenen Szenarien, in denen eine logische Partitionierung erforderlich ist, umfangreiche Verwendung Elemente ist erforderlich. Beispielsweise können Sie std::remove verwenden, um:

  • Elemente, die ein bestimmtes Kriterium erfüllen, von solchen zu trennen, die dies nicht erfüllen.
  • Ähnliche Elemente gruppieren.
  • Finden Sie die Position eines bestimmten Elements oder einer Gruppe von Elementen.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3