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

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

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

std::string stHehe("Hello ");

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

7 ответов


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

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

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

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

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

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

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

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

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


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

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

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

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


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

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


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


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

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

конкатенации ты показываешь вполне допустимо. Хотя конкатенация с использованием stringstream возможна, это не самая полезная функция stringstreams, которая должна иметь возможность вставлять и извлекать POD и абстрактные типы данных.


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

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