В чем разница между 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 и абстрактные типы данных.
зачем открывать файл для чтения и записи, если вам нужно только читать из него, например?
Что делать, если несколько процессов, необходимых для чтения из одного файла?