remove_copy_if() funktioniert auf string nicht ???
-
zahl.resize(mem.length());
-
Beide vorschläge funktionieren:
string::iterator itr = zahl.begin(); insert_iterator<string> its(zahl,itr); remove_copy_if(mem.begin(),mem.end(),its,istZahl);zahl.resize(mem.length()); remove_copy_if(mem.begin(),mem.end(),zahl.begin(),istZahl);Obwohl ich mir beim 2. nicht sicher wahr. string sollte doch selber sich vergrößern ???
Ach und jetzt werden in "zahl" die Bustaben gespeichert, obwohl das Verhalten anders sein sollte ???
Was ist jetzt wieder falsch...Wenn ich dann natürlich true und false vertausche klappt es

Aber soll solls ja nicht sein.
-
Freak_Coder schrieb:
Obwohl ich mir beim 2. nicht sicher wahr. string sollte doch selber sich vergrößern ???
Ja, wenn du mittels append(), operator+= etc. etwas anhängst, passt er die Größe an, bei deiner Iterator-Konstruktion schreibst du auf uninitialisierten Speicher (wenn die Bibliothek das nicht entschärft).
Ach und jetzt werden in "zahl" die Bustaben gespeichert, obwohl das Verhalten anders sein sollte ???
Was ist jetzt wieder falsch...remove_copy_if macht genau das, was der Name andeutet, es schmeißt alle Elemente weg ("remove"), die die angegebene Bedingung erfüllen ("if") und überträgt die übrigen ans Ziel ("copy"). Das heißt, mit deinem Prädikat löscht er dir alle Ziffern aus dem übergebenen String.
-
CStoll schrieb:
überträgt die übrigen ans Ziel ("copy")
Achso, ich dachte die die er löscht kopiert er ...

-
CStoll schrieb:
Freak_Coder schrieb:
Obwohl ich mir beim 2. nicht sicher wahr. string sollte doch selber sich vergrößern ???
Ja, wenn du mittels append(), operator+= etc. etwas anhängst, passt er die Größe an, bei deiner Iterator-Konstruktion schreibst du auf uninitialisierten Speicher (wenn die Bibliothek das nicht entschärft).
Ich hätte gedacht die STL ist schlau genug um den String auch noch zu vergrößern...
remove_copy_if() hätte ja auch append() und operator+= aufrufen können um in den string reinzuschreiben. Wie kriegt er sonst die Daten da rein.
-
Nein, das ist abgeleitet von "remove_if()" - lösche alle Zeichen, die die Bedingung erfüllen.
Eine Aussage, die mir Google geliefert hat (http://www.infosys.tuwien.ac.at/Research/Component/tutorial/prw432.htm):
remove_copy_if writes all elements referred to by the iterator i in the range [first, last) to the output iterator result, for which the following condition does not hold:
pred(*i) == true. The algorithm returns the end of the resulting range.
(btw, in der zweiten Variante (resize) solltest du den String noch auf die richtige Länge stutzen)
-
CStoll schrieb:
(btw, in der zweiten Variante (resize) solltest du den String noch auf die richtige Länge stutzen)
Stimmt. OK

-
Freak_Coder schrieb:
Ich hätte gedacht die STL ist schlau genug um den String auch noch zu vergrößern...
remove_copy_if() hätte ja auch append() und operator+= aufrufen können um in den string reinzuschreiben. Wie kriegt er sonst die Daten da rein.Die STL ist generisch aufgebaut - dadurch kannst du die Algorithmen identisch mit jedem Container verwenden, der geeignete Iteratoren bereitstellt. Der Nachteil davon ist, daß die Algorthmen nicht auf container-spezifische Funktionen zurückgreifen können (stell dir mal vor, was passiert, wenn du append() auf ein old-style Array anwenden willst ;)).
Und genau dafür ist der insert_iterator (und Kollegen) gedacht - er erwartet im unterliegenden Container eine insert()-Methode, an die er die ankommenden Daten weitergibt (std::string hat glücklicherweise eine, die auch in der Lage ist, die Stringlänge aktuell zu halten).
-
Thx for Info
(Ich sollte mal langsam Anfangen mich mit der Stl näher zu beschäftigen
)
-
Freak_Coder schrieb:
(Ich sollte mal langsam Anfangen mich mit der Stl näher zu beschäftigen
)Ist sicher eine gute Idee - in der STL sind mehr nützliche Sachen drin als man vermutet. Und du kannst sie bei Bedarf frei erweitern und mit eigenen Dateitypen und Algorithmen kombinieren.