2010-08-09 2 views
21

У меня есть объект stringstream ss1как копировать из одного объекта stringstream в другой в C++?

Теперь я хотел бы создать еще одну копию из этого.

Я стараюсь это

std::stringstream ss2 = ss1; 

или

std::stringstream ss2(ss1) 

ни работает

сообщение об ошибке, как это

STD :: :: КСН basic_ios (сопзЬ станд :: ios &) недоступен из bsl :: basic_stringstream, bsl :: allocator> :: basi c_stringstream (const bsl :: basic_stringstream, bsl :: allocator> &).

ответ

33

Действительно, потоки не являются копируемыми (хотя они подвижны).

В зависимости от вашего использования, следующие работает очень хорошо:

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

Выход:

некоторые 123 вещи
некоторые 123 вещи

+0

Является ли это более эффективным, чем ответ Педро д'Акино, поскольку он кажется более прямым. – alfC

+0

@alfC: вам нужно просмотреть профиль, но просто угадать, что это, скорее всего, более эффективно, потому что он копирует из одного буфера непосредственно в другой и не динамически выделяет строку между ними. – GManNickG

+0

(Теперь я прокрутил вниз, чтобы увидеть комментарий в другом ответе. Извините за повторный вопрос) – alfC

7

Как std::stringstreamdoes not provide копию конструктора, вы должны построить его из std::stringss1 выходов:

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

Единственная проблема, которую я могу видеть это заставляет ss1' кашлять строку, которая затем будет вставлена ​​в 'ss2'. 'rdbuf' просто делает это напрямую. – GManNickG

+1

Согласовано. Я думаю, что это решение менее эффективно, чем выше, потому что оно требует выделения строки и двух копий. – bhekman

Смежные вопросы