Wie ein Ostringstream wiederverwenden?
-
05-07-2019 - |
Frage
Ich mag ein Ostringstream löschen und wiederverwendet wird (und den zugrunde liegenden Puffer), so dass mein App nicht so viele Zuweisungen zu tun hat. Wie setze ich das Objekt in seinen Ausgangszustand?
Lösung
Ich habe eine Reihe von klaren und str in der Vergangenheit verwendet:
// clear, because eof or other bits may be still set.
s.clear();
s.str("");
Was hat das getan für Eingang und Ausgang stringstreams. Alternativ können Sie manuell löschen, suchen Sie dann die entsprechende Sequenz die beginnen:
s.clear();
s.seekp(0); // for outputs: seek put ptr to start
s.seekg(0); // for inputs: seek get ptr to start
Das wird einige Umschichtungen von str
getan verhindert durch Überschreiben, was in dem Ausgabepuffer ist zur Zeit statt. Die Ergebnisse sind wie folgt:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b";
assert(s.str() == "bello");
Wenn Sie die Zeichenfolge für c-Funktionen nutzen möchten, können Sie std::ends
verwenden, eine abschließende Null wie folgt setzen:
std::ostringstream s;
s << "hello";
s.seekp(0);
s << "b" << std::ends;
assert(s.str().size() == 5 && std::strlen(s.str().data()) == 1);
std::ends
ist ein Relikt aus der veralteten std::strstream
, die direkt an ein char-Array schreiben, konnte man auf dem Stack zugeordnet. Sie hatte eine abschließende Null manuell einzufügen. Allerdings std::ends
nicht veraltet ist, ich glaube, weil es, wie in den oben genannten Fällen noch nützlich ist.
Andere Tipps
Es scheint zu sein, dass der ostr.str("")
Aufruf den Trick funktioniert.
Wenn Sie vorhaben, den Puffer in eine Art und Weise zu löschen, die es bewirkt, dass gelöscht werden, bevor es die erste Gebrauch ist, müssen Sie etwas zu dem Puffer hinzuzufügen ersten w / MSVC.
struct Foo {
std::ostringstream d_str;
Foo() {
d_str << std::ends; // Add this
}
void StrFunc(const char *);
template<class T>
inline void StrIt(const T &value) {
d_str.clear();
d_str.seekp(0); // Or else you'll get an error with this seek
d_str << value << std::ends;
StrFunc(d_str.str().c_str()); // And your string will be empty
}
};
Sie dies nicht tun. Verwenden Sie zwei unterschiedlich benannte Datenströme für Klarheit und lassen Sie die optimierenden Compiler Figur heraus, dass es die alten wiederverwenden kann.