C - Каква е разликата между istringstream, ostringstream и stringstream

Кога ще използвам std: istringstream, std: ostringstream и std: stringstream и защо не трябва просто да използвам std: stringstream във всеки сценарий (има ли проблеми с производителността по време на изпълнение?).

И накрая, нещо лошо в това (вместо изобщо да използваме поток):

Лично аз намирам много рядко, че искам да предавам към и от същия поток от низове.

Обикновено искам или да инициализирам поток от низ и след това да го анализирам; или предайте нещата на поток от низове и след това извлечете резултата и го съхранете.

Ако предавате поточно към един поток от един поток, трябва да сте много внимателни с позицията на потока и позициите на потока.

Използването на „just“ istringstream или ostringstream изразява по-добре намеренията ви и ви дава известна проверка срещу глупави грешки като случайно използване vs >> .

Може да има някои подобрения в производителността, но не бих ги разглеждал на първо място.

Няма нищо лошо в това, което сте написали. Ако установите, че не работи достатъчно добре, можете да измислите други подходи, в противен случай се придържайте към това, което е най-доброто. Лично аз просто бих избрал:

Потокът от низове е малко по-голям и може да има малко по-ниска производителност - многократното наследяване може да изисква коригиране на показалеца на vtable. Основната разлика (поне на теория) изразява по-добре вашите намерения и предотвратява случайно използване на >> там, където сте планирали (или обратно). OTOH, разликата е достатъчно малка, че особено за бързи фрагменти от демо код и т.н., аз съм мързелив и просто използвам stringstream. Не мога да си спомня последния път, когато случайно използвах, когато възнамерявах >>, така че за мен тази реплика за сигурност изглежда предимно теоретична (особено след като, ако направите такава грешка, тя почти винаги ще бъде наистина очевидна почти веднага).

Добре е да използвате низ, стига да прави това, което искате. Ако просто влагате низове, това е лесно и работи чудесно. Ако искате да форматирате други типове данни, тогава stringstream ще поддържа това, а низът всъщност няма.

По-голямата част от времето няма да имате нужда както от вход, така и от изход за един и същи низ, така че използването на std: ostringstream и std: istringstream ясно изяснява намерението ви. Той също така ви предпазва от случайно въвеждане на грешен оператор (vs >>).

Ако трябва да направите и двете операции в една и съща нишка, очевидно ще използвате версията с общо предназначение.

Проблемите с производителността биха били най-малкото, от което се притеснявате тук, яснотата е основната полза.

И накрая, няма нищо лошо в използването на добавяне на ред, тъй като трябва да изградите чисти линии. Просто не можете да използвате това, за да комбинирате числа, както можете на езици като perl.

Други вече са се справили с stringstream vs. [i | o] stringstream е достатъчно добър; не е нужно да ходя там.

Що се отнася до std: string - добре, не вярвам да има оператори или >>, така че не можете да го използвате там, където може да е необходим файлов поток. По-важното е, че бих очаквал повтарящи се и произволни конкатенации за std: string да имат производителност O (N 2) или в най-добрия случай O (N * log (N)) производителност, като разликата е в това колко внимателен трябва да бъде програмистът, за да разпредели допълнителен капацитет в целевата линия. Въпреки това, N конкатенациите в ostringstream трябва да имат O (N) ефективност (като оставим настрана дължината на отделните низове). Това може да е тривиална разлика, когато обединявате само един или два низа и ostringstream може да е все още по-бавен от std: string, когато N е малък. Но знам за случаи, когато N е бил много голям и изпълнението е O (N 2) наистина боли.

istringstream за вход, ostringstream за изход. stringstream - вход и изход. Можете да използвате stringstream почти навсякъде. Ако обаче предадете своя обект на друг потребител и използвате оператора →, докато очаквате обект само за запис, няма да бъдете доволни; -)

PS: нищо лошо в това, просто проблеми с производителността.

За да отговорите на третия въпрос: Не, това е напълно разумно. Предимството на използването на потоци е, че можете да въведете каквато и стойност да е получил операторът, но можете да добавите низове (C ++ или C) към std: string .

Предполага се, че ако само вмъкване или само извлечение е подходящо за вашата операция, можете да използвате една от версиите на префикса "i" или "o", за да изключите нежеланата операция.

Ако няма значение, можете да използвате i/o версията.

Конкатенацията на низове, която показвате, е абсолютно правилна. Докато конкатенацията с помощта на низ поток е възможна, което не е най-полезната характеристика на низовете, които трябва да могат да вмъкват и извличат POD и абстрактни типове данни.

Защо да отваряте файл за достъп за четене/запис, когато трябва само да го прочетете?