Heim >Backend-Entwicklung >C++ >Wie entferne ich während der Iteration effizient Elemente aus einem std::vector?
Beim Durchlaufen eines std::vector und Ausführen von Aktionen, die eine Änderung der Größe des Vektors erfordern, wie z. B. Löschen Elemente können Sie auf das Problem stoßen, Iteratoren ungültig zu machen. Dies liegt daran, dass die Methode erase(), die zum Entfernen von Elementen verwendet wird, die Größe des Vektors ändert und alle vorhandenen Iteratoren ungültig macht.
Um dies zu umgehen, besteht eine effiziente Lösung darin, den Rückgabewert zu verwenden der erase()-Methode, die einen neuen, gültigen Iterator bereitstellt, der auf das Element zeigt, das unmittelbar auf das gelöschte folgt. Dadurch können Sie die Iteration fortsetzen, ohne sich Gedanken über ungültige Iteratoren machen zu müssen.
Der folgende Code demonstriert diesen Ansatz:
<code class="cpp">std::vector<std::string>::iterator iter; for (iter = m_vPaths.begin(); iter != m_vPaths.end(); ) { if (::DeleteFile(iter->c_str())) { iter = m_vPaths.erase(iter); // Returns a new valid iterator } else { ++iter; // Advance iterator if file deletion failed } }</code>
In diesem Code wird der Iterator so aktualisiert, dass er auf den zeigt Nächstes Element nach jedem erfolgreichen Löschen der Datei, sodass die Iteration reibungslos ablaufen kann.
Die Verwendung des Iterator-Ansatzes ist zwar effizient, ändert jedoch dennoch den ursprünglichen m_vPaths-Vektor, was möglicherweise die Leistung beeinträchtigt Dies hat Auswirkungen, wenn Sie mehrere Löschvorgänge durchführen müssen. In solchen Fällen ist es möglicherweise besser, die Verwendung einer alternativen Datenstruktur in Betracht zu ziehen, die für das effiziente Löschen von Elementen optimiert ist, wie zum Beispiel:
Das obige ist der detaillierte Inhalt vonWie entferne ich während der Iteration effizient Elemente aus einem std::vector?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!