Ich versuche, ein kleines Programm zu erstellen, das INI-Dateien für die Verwendung in einem späteren Projekt verarbeitet, indem es zuerst seine Größe reduziert, sobald es in den Speicher geladen wurde. Also,
Dabei ist vLine ein Vektor, der den Dateiinhalt enthält
%Vor%Beim Drucken von vLine bleiben Leerzeichen übrig, in denen einmal eine mit einem Semikolon beginnende Zeile existiert, z. B.
%Vor%Mit resize () wird das letzte Element aus der Liste entfernt, anstatt diese leeren Teile zu entfernen. Das gleiche Problem besteht, wenn ich Zeilen lösche, die nur whitespace mit löschen () enthalten.
Ist es möglich, diese leeren Elemente zu entfernen, während die Reihenfolge von vLine beibehalten wird?
(Entschuldigung, dass ich hier keine Iteratoren benutzt habe.)
Dies:
%Vor% löscht vLine[i]
nicht aus dem Vektor. Der Ausdruck vLine[i]
liefert einen Verweis auf das Element am Index i
. Unter der Annahme, dass vLine
vom Typ std::vector<std::string>
ist, ruft der Funktionsaufruf erase()
tatsächlich string::erase()
für das Element auf, nicht vector::erase()
für den Vektor. Alles, was Sie tun, ist dieses spezielle Element leer zu machen.
Was Sie wahrscheinlich wollen, ist etwa so:
%Vor%Dies entfernt das Element tatsächlich aus dem Vektor. Jetzt werden alle aktuellen Iteratoren für den Vektor ungültig und die Indizes werden nicht mehr korrekt sein. Dies ist eine Situation, in der Sie wirklich Iteratoren verwenden müssen.
%Vor% Aber es gibt einen noch einfacheren Weg, dies zu tun: Verwenden Sie den Standardalgorithmus std::remove_if()
mit einem Funktor Rufen Sie dann vLine.erase()
auf.
Wenn Sie einen C ++ 11-Compiler verwenden können, können Sie auch lambda-Ausdrücke verwenden, um noch prägnanter zu sein.
Das Problem liegt in Ihrer Logik zum Entfernen der Elemente. Wenn Sie auf ein Element mit dem Index i
stoßen, das Sie löschen möchten, löschen Sie seinen Wert, aber Sie entfernen ihn nicht aus dem Vektor.
Der Standard und einfachste Weg, was Sie tun möchten, ist std::remove_if
: