Sự khác biệt giữa dòng i chuỗi, dòng chảy và chuỗi dòng là gì? / Tại sao không sử dụng chuỗi ký tự trong mọi trường hợp?


163

Khi tôi sẽ sử dụng std::istringstream, std::ostringstreamstd::stringstreamvà lý do tại sao không nên tôi chỉ sử dụng std::stringstreamtrong tất cả các kịch bản (đang có bất kỳ vấn đề hiệu suất thời gian chạy?).

Cuối cùng, có điều gì xấu về điều này (thay vì sử dụng một luồng nào cả):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";

Câu trả lời:


119

Cá nhân, tôi thấy rất hiếm khi tôi muốn thực hiện truyền phát vào và ra cùng một chuỗi chuỗi.

Thông thường tôi muốn khởi tạo một luồng từ một chuỗi và sau đó phân tích cú pháp; hoặc truyền mọi thứ vào một chuỗi chuỗi và sau đó trích xuất kết quả và lưu trữ nó.

Nếu bạn đang truyền phát đến và từ cùng một luồng, bạn phải rất cẩn thận với trạng thái luồng và vị trí luồng.

Sử dụng 'chỉ' istringstreamhoặc ostringstreamthể hiện tốt hơn ý định của bạn và cung cấp cho bạn một số kiểm tra chống lại sai lầm ngớ ngẩn như vô tình sử dụng <<vs >>.

thể có một số cải tiến hiệu suất nhưng tôi sẽ không nhìn vào đó đầu tiên.

Không có gì sai với những gì bạn đã viết. Nếu bạn thấy nó không hoạt động đủ tốt, thì bạn có thể mô tả các cách tiếp cận khác, nếu không thì hãy kiên định với những gì rõ ràng nhất. Cá nhân, tôi chỉ đi cho:

std::string stHehe( "Hello stackoverflow.com!" );

22

A stringstreamcó phần lớn hơn và có thể có hiệu suất thấp hơn một chút - nhiều kế thừa có thể yêu cầu điều chỉnh con trỏ vtable. Sự khác biệt chính là (ít nhất là về lý thuyết) thể hiện tốt hơn ý định của bạn và ngăn bạn vô tình sử dụng >>nơi bạn dự định <<(hoặc ngược lại). OTOH, sự khác biệt là đủ nhỏ, đặc biệt là đối với các đoạn mã trình diễn nhanh và như vậy, tôi lười biếng và chỉ sử dụng stringstream. Tôi có thể không hoàn toàn nhớ lần cuối cùng tôi vô tình sử dụng <<khi tôi có ý định >>, vì vậy với tôi rằng chút an toàn dường như chủ yếu là lý thuyết (đặc biệt là vì nếu bạn làm làm cho một sai lầm như vậy, nó sẽ hầu như luôn thực sự rõ ràng gần như ngay lập tức).

Không có gì sai khi chỉ sử dụng một chuỗi, miễn là nó hoàn thành những gì bạn muốn. Nếu bạn chỉ cần đặt các chuỗi với nhau, nó dễ dàng và hoạt động tốt. Nếu bạn muốn định dạng các loại dữ liệu khác, stringstreamthì sẽ hỗ trợ điều đó và chủ yếu là một chuỗi.


17

Trong hầu hết các trường hợp, bạn sẽ không thấy mình cần cả đầu vào và đầu ra trên cùng một chuỗi, do đó, việc sử dụng std::ostringstreamstd::istringstreamlàm rõ ràng ý định của bạn rõ ràng. Nó cũng ngăn bạn vô tình gõ nhầm toán tử ( <<vs >>).

Khi bạn cần thực hiện cả hai thao tác trên cùng một luồng, rõ ràng bạn sẽ sử dụng phiên bản mục đích chung.

Vấn đề hiệu suất sẽ là mối quan tâm ít nhất của bạn ở đây, sự rõ ràng là lợi thế chính.

Cuối cùng, không có gì sai khi sử dụng nối thêm chuỗi khi bạn phải xây dựng chuỗi thuần. Bạn không thể sử dụng số đó để kết hợp các số như bạn có thể trong các ngôn ngữ như perl.


8

iopesstream là cho đầu vào, Ostringstream cho đầu ra. chuỗi dòng là đầu vào và đầu ra. Bạn có thể sử dụng chuỗi ký tự khá nhiều ở mọi nơi. Tuy nhiên, nếu bạn đưa đối tượng của mình cho một người dùng khác và nó sử dụng toán tử >> trong khi bạn chờ đợi một đối tượng chỉ ghi, bạn sẽ không vui ;-)

PS: không có gì xấu về nó, chỉ là vấn đề hiệu suất.


2

Để trả lời câu hỏi thứ ba của bạn: Không, điều đó hoàn toàn hợp lý. Ưu điểm của việc sử dụng các luồng là bạn có thể nhập bất kỳ loại giá trị nào đã operator<<được xác định, trong khi bạn chỉ có thể thêm các chuỗi (C ++ hoặc C) vào a std::string.


1

Có lẽ khi chỉ chèn hoặc chỉ trích xuất là phù hợp với hoạt động của bạn, bạn có thể sử dụng một trong các phiên bản tiền tố 'i' hoặc 'o' để loại trừ thao tác không mong muốn.

Nếu điều đó không quan trọng thì bạn có thể sử dụng phiên bản i / o.

Kết nối chuỗi bạn đang hiển thị là hoàn toàn hợp lệ. Mặc dù việc kết hợp bằng cách sử dụng chuỗi dòng có thể không phải là tính năng hữu ích nhất của chuỗi chuỗi, đó là có thể chèn và trích xuất POD và các loại dữ liệu trừu tượng.



0

Tại sao mở một tệp để truy cập đọc / ghi nếu bạn chỉ cần đọc từ nó?

Điều gì nếu nhiều quá trình cần thiết để đọc từ cùng một tập tin?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.