2013-02-06 31 views
21

Tôi biết một trong những ưu điểm của std::stringstream là nó là std::istream để nó có thể chấp nhận đầu vào từ bất kỳ loại nào định nghĩa operator<< thành std::istream và cũng từ các loại nguyên thủy.std :: stringstream vs std :: chuỗi để nối nhiều chuỗi

Tôi sẽ không sử dụng operator<<; thay vào đó tôi chỉ sẽ nối nhiều dây. Việc triển khai std::stringstream có làm cho nó nhanh hơn std::string để nối nhiều chuỗi không?

+1

So với những gì? '.append()'/'operator + ='? – Rapptz

+3

Tôi nghĩ một .reserve() theo sau là nhiều .append()/+ = nên khá hiệu quả. Các chuỗi không thay đổi trong C++ giống như chúng ở trong Java/C#/etc, vì vậy không có lý do gì để có một lớp kiểu StringBuilder. – Bwmat

+0

@Rapptz Có. 'append()' và 'operator + =' –

Trả lời

26

Không có lý do gì để mong đợi chức năng chèn của std::string chậm hơn các chức năng chèn của stringstream. std::string nói chung sẽ không có gì hơn là phân bổ/sao chép bộ nhớ có thể cùng với việc sao chép dữ liệu vào bộ nhớ. stringstream phải xử lý những thứ như ngôn ngữ, v.v., ngay cả đối với các cuộc gọi cơ bản write.

Ngoài ra, std::string cung cấp các cách để giảm thiểu hoặc loại bỏ mọi thứ trừ phân bổ bộ nhớ đầu tiên. Nếu bạn reserve đủ không gian, mỗi lần chèn ít hơn memcpy. Điều đó không thực sự có thể với stringstream.

Thậm chí nếu nó nhanh hơn các chức năng phụ của std::string, bạn vẫn còn để sao chép chuỗi ra khỏi số stringstream để làm điều gì đó với nó. Vì vậy, đó là một phân bổ + bản sao khác, mà bạn sẽ không cần với std::string.

Bạn nên sử dụng std::stringstream nếu bạn cần định dạng, không chỉ để gắn bó một số chuỗi với nhau.

+0

Vì vậy, tôi phải làm gì nếu tôi chỉ cần gắn một số dây lại với nhau? Tôi biết chính xác kích thước của chuỗi kết quả vì vậy tôi muốn preallocate nó, nhưng các mã mà dính strings togethers đòi hỏi một OStream và sử dụng '<<' cho nối (nó hoạt động với 'std :: cout',' std :: cerr', 'std :: stringstream') nhưng nó không hoạt động với' std :: string'. Tôi thực sự cần phải viết một wrapper nhỏ xung quanh 'std :: string' chỉ cho điều này? – gnzlbg

+0

Tôi chỉ viết một wrapper nhỏ xung quanh một std :: string với một 'operator <<' mà concatenates và làm việc tốt. Tôi chỉ dự trữ kích thước cuối cùng và sau khi nối tôi di chuyển chuỗi ra. Cảm thấy như thời kỳ đồ đá: chuỗi có 'append' và' operator + 'trong khi' stream' có 'write' và' operator << '... – gnzlbg