2010-08-09 20 views
21

J'ai stringstream objet ss1comment copier d'un objet stringstream à un autre en C++?

maintenant je voudrais créer une autre copie à partir de celui-ci.

J'essaie cette

std::stringstream ss2 = ss1; 

ou

std::stringstream ss2(ss1) 

ne fonctionne

Le message d'erreur est comme cette

std :: ios :: basic_ios (const std :: ios &) n'est pas accessible depuis bsl :: basic_stringstream, bsl :: allocateur> :: basi c_stringstream (const bsl :: basic_stringstream, bsl :: allocateur> &).

Répondre

33

En effet, les ruisseaux sont incopiable (si elles sont mobiles).

En fonction de votre utilisation, ce qui suit fonctionne très bien:

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

Sortie:

certains 123 trucs
certains 123 trucs

+0

Est-ce plus efficace que la réponse de Pedro d'Aquino, car il semble être plus simple. – alfC

+0

@alfC: Vous devez le profiler pour le voir, mais deviner cela est probablement plus efficace car il copie d'un tampon directement dans un autre, et n'alloue pas dynamiquement une chaîne entre-deux. – GManNickG

+0

(Maintenant je fais défiler vers le bas pour voir le commentaire dans l'autre réponse Désolé pour la question répétée) – alfC

7

Comme std::stringstreamdoes not provide un constructeur de copie, vous devez construire des std::stringss1 sorties:

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

Le seul problème que je peux voir avec c'est ce qui force 'ss1' à cracher une corde, qui sera alors réinsérée dans' ss2'. 'rdbuf' le fait directement. – GManNickG

+1

D'accord. Je pense que cette solution est moins efficace que celle ci-dessus, car elle nécessite l'allocation d'une chaîne et de deux copies. – bhekman