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:
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