2010-08-09 22 views
21

Mam obiekt strumienia string ss1jak skopiować z jednego obiektu stringstream do innego w C++?

teraz chciałbym utworzyć inną kopię z tego.

próbuję to

std::stringstream ss2 = ss1; 

lub

std::stringstream ss2(ss1) 

nie działa

Komunikat o błędzie jest podobny do tego

std :: ios :: basic_ios (const std :: ios &) nie jest dostępny z bsl :: basic_stringstream, bsl :: allocator> :: basi c_stringstream (const bsl :: basic_stringstream, bsl :: allocator> &).

Odpowiedz

33

Rzeczywiście, strumienie nie copyable (choć mogą się poruszać).

zależności od zużycia, następujący działa całkiem dobrze:

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

wyjściowa:

niektóre 123 rzeczy
niektóre 123 rzeczy

+0

Jest to bardziej skuteczne niż odpowiedź Pedro d'Aquino, ponieważ wydaje się bardziej proste. – alfC

+0

@alfC: Musisz profilować, ale domyślam się, że to jest bardziej wydajne, ponieważ kopiuje z jednego bufora bezpośrednio do innego i nie dynamicznie przydziela ciąg pomiędzy. – GManNickG

+0

(Teraz przewijam w dół, aby zobaczyć komentarz w drugiej odpowiedzi. Przepraszamy za powtarzające się pytanie) – alfC

7

jako std::stringstreamdoes not provide konstruktor kopii, trzeba zbudować z std::stringss1 wyjść:

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

Jedyny problem widzę z to zmusza 'ss1' do odkasowania ciągu, który następnie zostanie ponownie wstawiony do' ss2'. 'rdbuf' po prostu robi to bezpośrednio. – GManNickG

+1

Uzgodnione. Myślę, że to rozwiązanie jest mniej wydajne niż powyższe, ponieważ wymaga przydziału ciągu i dwóch kopii. – bhekman

Powiązane problemy