2010-08-09 76 views
21

Tôi có đối tượng stringstream ss1cách sao chép từ một đối tượng chuỗi này sang đối tượng khác trong C++?

bây giờ tôi muốn tạo một bản sao khác từ bản này.

tôi cố gắng này

std::stringstream ss2 = ss1; 

hoặc

std::stringstream ss2(ss1) 

không phải làm việc

Các thông báo lỗi là như thế này

std :: ios :: basic_ios (std :: const ios &) không thể truy cập từ bsl :: basic_stringstream, bsl :: allocator> :: basi c_stringstream (const bsl :: basic_stringstream, bsl :: allocator> &).

Trả lời

33

Thật vậy, con suối đều là phòng không copyable (mặc dù họ đang di chuyển).

Tùy thuộc vào cách sử dụng của bạn, sau đây hoạt động khá tốt:

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

Output:

số 123 thứ
số 123 thứ

+0

Điều này có hiệu quả hơn câu trả lời của Pedro d'Aquino hay không, vì nó có vẻ thẳng thắn hơn. – alfC

+0

@alfC: Bạn phải xem tiểu sử để xem, nhưng chỉ đoán điều này có khả năng hiệu quả hơn vì nó sao chép từ bộ đệm này trực tiếp vào bộ đệm khác và không phân bổ động một chuỗi ở giữa. – GManNickG

+0

(Bây giờ tôi cuộn xuống để xem bình luận trong câu trả lời khác. Xin lỗi cho câu hỏi lặp lại) – alfC

7

Như std::stringstreamdoes not provide một constructor sao chép, bạn phải xây dựng nó từ std::stringss1 kết quả đầu ra:

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

Vấn đề duy nhất mà tôi có thể nhìn thấy bằng điều này là nó buộc 'ss1' ho lên một chuỗi, sau đó sẽ được chèn lại vào' ss2'. 'rdbuf' chỉ thực hiện trực tiếp. – GManNickG

+1

Đồng ý. Tôi nghĩ giải pháp này kém hiệu quả hơn giải pháp trên, vì nó yêu cầu phân bổ một chuỗi và hai bản sao. – bhekman

Các vấn đề liên quan