Яка різниця між istringstream, ostringstream та stringstream? / Чому б не використовувати стрингстрім у кожному випадку?


163

Коли я використовую std::istringstream, std::ostringstreamі std::stringstreamчому б мені не просто використовувати std::stringstreamв кожному сценарії (чи є якісь - або проблеми з продуктивністю виконання?).

Нарешті, чи є щось погане в цьому (замість того, щоб взагалі використовувати потік):

std::string stHehe("Hello ");

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

Відповіді:


119

Особисто мені дуже рідко здається, що я хочу виконувати потокове передавання в один і той же потоковий потік.

Зазвичай я хочу або ініціалізувати потік з рядка, а потім проаналізувати його; або передайте речі в потоковий рядок, а потім витягніть результат і збережіть його.

Якщо ви потоково передаєтесь в той самий потік і з нього, ви повинні бути дуже обережними зі станом потоку та позиціями потоку.

Використання «просто» istringstreamабо ostringstreamкраще висловлює ваш намір і дають деяку перевірку проти дурних помилок , таких як випадкове використання <<проти >>.

Там може бути деяке поліпшення продуктивності , але я б не дивлячись на те , в першу чергу.

Немає нічого поганого в тому, що ви написали. Якщо ви виявите, що вона не працює досить добре, то ви можете запропонувати інші підходи, інакше дотримуйтесь того, що найясніше. Особисто я просто хотів би:

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

22

А stringstreamдещо більший і може мати трохи нижчу продуктивність - багатократне успадкування може зажадати коригування покажчика vtable. Основна відмінність - це (принаймні теоретично) краще виражати свої наміри та не давати вам випадково використовувати >>там, де ви мали намір <<(або навпаки). Щодо іншого, різниця досить мала, що особливо для швидких бітів демонстраційного коду і такого, я лінивий і просто користуюся stringstream. Я не можу точно пригадати , коли в останній раз я випадково використовується , <<коли я збирався >>, так що мені , що трохи безпеки , здається , в основному теоретичний (тим більше , що якщо ви робите таку помилку, то це майже завжди буде на самому ділі очевидно , майже відразу).

Нічого нічого поганого в тому, що ви просто використовуєте рядок, доки вона виконує те, що ви хочете. Якщо ви просто збираєте рядки разом, це легко і добре працює. Якщо ви хочете відформатувати інші типи даних, stringstreamпідтримка цього буде підтримувати, а рядок здебільшого не буде.


17

У більшості випадків вам не доведеться потребувати введення та виводу в одній і тій же потоковій лінії, тому використання std::ostringstreamта std::istringstreamявне чітке пояснення вашого наміру. Це також запобігає випадковому набору неправильного оператора ( <<vs >>).

Коли вам потрібно виконати обидві операції в одному потоці, ви, очевидно, використовували б загальну версію.

Питання щодо ефективності були б найменшими проблемами, чіткість - головна перевага.

Нарешті, немає нічого поганого у використанні додавання рядків, оскільки ви повинні будувати чисті рядки. Ви просто не можете використовувати це для об'єднання чисел на зразок мов, таких як perl.


8

istringstream - це для введення, ostringstream - для виведення. streamstream - це вхід і вихід. Ви можете використовувати струнні потоки майже скрізь. Однак, якщо ви віддасте об’єкт іншому користувачеві, і він використовує оператор >> тоді як ви, де очікуєте написати лише об’єкт, не будете щасливі ;-)

PS: нічого поганого в цьому, лише питання продуктивності.


2

Щоб відповісти на ваше третє запитання: Ні, це абсолютно розумно. Перевага використання потоків полягає в тому, що ви можете вводити будь-яке значення, яке було operator<<визначено, тоді як ви можете додавати лише рядки (C ++ або C) до a std::string.


1

Імовірно, коли для вашої операції підходить лише вставка або лише вилучення, ви можете використовувати одну з попередньо встановлених версій 'i' або 'o' для виключення небажаної операції.

Якщо це не важливо, ви можете використовувати версію i / o.

З'єднання рядків, яке ви показуєте, цілком справедливо. Хоча можливе конкатенація за допомогою stringstream, що не є найбільш корисною особливістю stringstream, яка полягає в тому, щоб мати можливість вставляти та витягувати POD та абстрактні типи даних.



0

Навіщо відкривати файл для доступу для читання / запису, якщо вам потрібно лише прочитати з нього, наприклад?

Що робити, якщо для того, щоб прочитати з одного файлу потрібно кілька процесів?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.