В чем разница между istringstream, ostringstream и stringstream?/ Почему бы не использовать строковый поток в каждом случае?

StackOverflow https://stackoverflow.com/questions/3292107

Вопрос

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

Наконец, есть ли в этом что-то плохое (вместо использования потока вообще):

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
Это было полезно?

Решение

Лично я считаю это очень редким, что я хочу выполнить потоковое движение и из одного и того же струнного потока.

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

Если вы транслируете и из того же потока, вы должны быть очень осторожны с потоковым состоянием и положениями потока.

Использование «просто» istringstream или ostringstream лучше выражает ваше намерение и дает вам некоторую проверку глупых ошибок, таких как случайное использование << VS >>.

Там может быть каким-то улучшением производительности, но я сначала не смотрю на это.

Нет ничего плохого в том, что вы написали.Если вы обнаружите, что он не работает достаточно хорошо, то вы можете профилировать другие подходы, в противном случае придерживайтесь того, что яснее.Лично я бы просто пошел:

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

Другие советы

A stringstream несколько больше и может иметь немного более низкую производительность - множественное наследование может потребовать корректировки указателя vtable.Основное отличие заключается (по крайней мере, в теории) в лучшем выражении ваших намерений и предотвращении случайного использования >> там, где вы намеревались << (или наоборот).OTOH, разница достаточно мала, особенно для быстрых фрагментов демонстрационного кода и тому подобного, я ленив и просто использую stringstream.Я не могу точно вспомнить, когда в последний раз я случайно использовал << когда я намеревался >>, так что для меня эта часть безопасности кажется в основном теоретической (тем более, что если вы делай соверши такую ошибку, и это почти всегда будет в самом деле очевидно почти сразу).

Нет ничего плохого в том, чтобы просто использовать строку, если она выполняет то, что вы хотите.Если вы просто соединяете строки вместе, это легко и прекрасно работает.Однако, если вы хотите отформатировать другие виды данных, a stringstream будет поддерживать это, а строка в большинстве случаев - нет.

В большинстве случаев вам не понадобится ввод и вывод в одном и том же строковом потоке, поэтому используйте std::ostringstream и std::istringstream явно проясняет ваше намерение.Это также предотвращает случайное введение неправильного оператора (<< против >>).

Если вам нужно выполнить обе операции в одном потоке, вам, очевидно, следует использовать версию общего назначения.

Проблемы с производительностью здесь будут волновать вас меньше всего, ясность — главное преимущество.

Наконец, нет ничего плохого в использовании добавления строк, поскольку вам приходится создавать чистые строки.Вы просто не можете использовать это для объединения чисел, как это можно сделать в таких языках, как Perl.

IstringStream предназначен для ввода, OSTRingStream для вывода.StringStream является введенным и выводом. Вы можете использовать StringStream в значительной степени везде. Однако, если вы дадите свое объект другому пользователю, и он использует оператор >>, тогда как вы, где ждать только объект записи, вы не будете счастливы; -)

PS: Ничего плохого об этом, просто проблемы с производительностью.

Чтобы ответить на ваш третий вопрос:Нет, это совершенно разумно.Преимущество использования потоков заключается в том, что вы можете вводить любое значение, имеющее operator<< определено, тогда как в файл можно добавлять только строки (C++ или C). std::string.

Предположительно, когда только вставка или только экстракция подходит для вашей операции, вы можете использовать один из префиксных версий «I» или «O», чтобы исключить ненужную работу.

Если это не важно, то вы можете использовать версию ввода / вывода.

Строконная конкатенация, которую вы показываете, совершенно действительна.Хотя возможна конкатенация с использованием StringStream, которая не является наиболее полезной особенностью StringStreams, которая должна иметь возможность вставлять и извлекать POD и абстрактные типы данных.

std :: stringstream :: str () Создает копию содержания потока, который удваивает использование памяти в некоторых ситуациях.Вместо этого вы можете использовать функцию std :: stringStream и его rdbuf (), чтобы избежать этого.

Подробнее здесь: Как написать OstringStream напрямую к Cout

Почему открыть файл для доступа к чтению / записи, если вам нужно только прочитать из него, например?

Что если несколько процессов необходимо прочитать из одного файла?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top