2010-08-09 13 views
21

Ho un oggetto stringstream ss1come copiare da un oggetto stringstream ad un altro in C++?

ora mi piacerebbe creare un'altra copia da questo.

provo questo

std::stringstream ss2 = ss1; 

o

std::stringstream ss2(ss1) 

né lavora

Il messaggio di errore è come questo

std :: ios :: basic_ios (std :: const ios &) non è accessibile da bsl :: basic_stringstream, bsl :: allocator> :: basi c_stringstream (const bsl :: basic_stringstream, bsl :: allocator> &).

risposta

33

In effetti, i flussi di traffico non copiabile (anche se sono mobili).

A seconda dell'uso, il seguente funziona abbastanza bene:

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::stringstream ss1; 
    ss1 << "some " << 123 << " stuff" << std::flush; 

    std::stringstream ss2; 
    ss2 << ss1.rdbuf(); // copy everything inside ss1's buffer to ss2's buffer 

    std::cout << ss1.str() << std::endl; 
    std::cout << ss2.str() << std::endl; 
} 

uscita:

alcuni 123 roba
alcuni 123 roba

+0

È più efficace della risposta di Pedro d'Aquino, poiché sembra essere più semplice. – alfC

+0

@alfC: Devi vedere il profilo, ma suppongo che questo sia probabilmente più efficiente perché copia da un buffer direttamente in un altro e non alloca dinamicamente una stringa intermedia. – GManNickG

+0

(Ora ho fatto scorrere verso il basso per vedere il commento nell'altra risposta. Mi spiace per la domanda ripetuta) – alfC

7

Come std::stringstreamdoes not provide un costruttore di copia, è necessario costruire dal std::stringss1 uscite:

std::stringstream ss2(ss1.str()); 
+2

L'unico problema che posso vedere con questo è ciò che costringe 'ss1' a criptare una stringa, che sarà poi reinserita in' ss2'. 'rdbuf' lo fa direttamente. – GManNickG

+1

concordato. Penso che questa soluzione sia meno efficiente di quella sopra, perché richiede l'allocazione di una stringa e due copie. – bhekman

Problemi correlati