Ich habe einen Namen std::string
, die ich mit Daten über eine std::ostream
Schnittstelle ausfüllen und eine Zeichenfolge Kopie vermeiden möchte.
Eine Möglichkeit, es zu tun, die eine Kopie mit sich bringt, dies zu tun:Vermeiden Sie das Kopieren von String aus ostringstream
bool f(std::string& out)
{
std::ostringstream ostr;
fillWithData(ostr);
out = ostr.str(); // 2 copies here
return true;
}
ich das Ergebnis durch out
und kann nicht Rückkehrostr.str()
übergeben müssen.
Ich möchte die Kopien in out = ostr.str();
vermeiden, da diese Zeichenfolge sehr groß sein kann.
Gibt es einen Weg, vielleicht mit rdbuf()
s, um den std::ostream
Puffer direkt an out
zu binden?
Um zu klären, ich Interesse an dem Auto-Erweiterung Verhalten von std::string
und std::ostream
so bin , dass der Anrufer nicht über die Größe vor dem Aufruf kennen.
UPDATE: Ich habe erkannt, dass die harmlos Linie out = ostr.str();
wahrscheinlich Kopien nach sich ziehen wird:
- Die erste von der
str()
Anruf - Die anderen von der
std::string
Zuweisungsoperator.
Sieht nicht möglich aus. Könnte Ihre Funktion 'f' ein' std :: ostringstream & 'als Argument haben? –
Das Problem mit dem, was Sie tun möchten, ist, dass der C++ - Standard den * std :: string_buf * 's internen Puffer nicht sein muss * std :: string * –
@DidierTrosset: Nicht wirklich. Die interne Verwendung von 'std :: ostringstream' ist ein Implementierungsdetail. –