Ho un nome std::string
che voglio riempire con i dati tramite un'interfaccia std::ostream
ed evitare una copia di stringa.
Un modo per farlo che fa coinvolgere un copia è per fare questo:Evitare di copiare string da ostringstream
bool f(std::string& out)
{
std::ostringstream ostr;
fillWithData(ostr);
out = ostr.str(); // 2 copies here
return true;
}
ho bisogno di passare attraverso il risultato out
e non può ritornoostr.str()
.
Desidero evitare le copie in out = ostr.str();
poiché questa stringa può essere molto grande.
C'è un modo, forse usando rdbuf()
s, per collegare il buffer std::ostream
direttamente a out
?
Per chiarire, io sono interessato al comportamento auto-espansione di std::string
e std::ostream
in modo che il chiamante non ha bisogno di conoscere la dimensione prima della chiamata.
UPDATE: Ho appena realizzato che la linea innocuo out = ostr.str();
probabilmente comporterà copie:
- Il primo dal
str()
chiamata - L'altro dall'operatore
std::string
assegnazione.
Non sembra possibile. La tua funzione 'f' potrebbe prendere un' std :: ostringstream & 'come argomento? –
Il problema con ciò che si vuole fare è che lo standard C++ non richiede che il buffer interno di * std :: string_buf * sia un * std :: string * –
@DidierTrosset: Non proprio. L'uso interno di 'std :: ostringstream' è un dettaglio di implementazione. –