2010-08-09 4 views
21

Ich habe stringstream Objekt ss1wie kopieren von einem Stringstream-Objekt in ein anderes in C++?

jetzt möchte ich eine andere Kopie von diesem erstellen.

Ich versuche, diese

std::stringstream ss2 = ss1; 

oder

std::stringstream ss2(ss1) 

weder arbeitet

Die Fehlermeldung ist wie dieser

std :: ios :: basic_ios (const std :: ios &) ist nicht zugänglich von bsl :: basic_stringstream, bsl :: allocator> :: basi c_stringstream (const bsl :: basic_stringstream, bsl :: Zuordner> &).

Antwort

33

Tatsächlich Ströme sind nicht kopierbar (obwohl sie beweglich sind).

Je nach Nutzung, funktioniert die folgende recht gut:

#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; 
} 

Ausgang:

einige 123 Sachen
einige 123 Sachen

+0

Ist das effizienter als die Antwort von Pedro d'Aquino, da es einfacher zu sein scheint. – alfC

+0

@alfC: Sie müssen Profil zu sehen, aber nur das Raten ist wahrscheinlich effizienter, weil es von einem Puffer direkt in einen anderen kopiert und nicht dynamisch eine Zeichenfolge dazwischen. – GManNickG

+0

(Jetzt scrollte ich nach unten, um den Kommentar in der anderen Antwort zu sehen. Sorry für die wiederholte Frage) – alfC

7

Als std::stringstreamdoes not provide eine Kopie Konstruktor, müssen Sie es von den std::stringss1 Ausgänge bauen:

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

Das einzige Problem, das ich mit sehen können Das ist es zwingt 'ss1', eine Saite auszuhusten, die dann wieder in' ss2' eingefügt wird. 'rdbuf' macht es einfach direkt. – GManNickG

+1

Einverstanden. Ich denke, diese Lösung ist weniger effizient als die obige, weil sie die Zuweisung eines Strings und zweier Kopien erfordert. – bhekman

Verwandte Themen