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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

istringstream для ввода, ostringstream для вывода. stringstream – вход и выход. Вы можете использовать stringstream почти везде. Однако, если вы передаете свой объект другому пользователю, и он использует оператор >>, тогда как вы, где ожидаете объект только для записи, не будете счастливы 😉

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

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

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

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

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

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

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

Давайте будем гением компьютера.