В чем разница между 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 сделать такую ошибку, это почти всегда будет действительно почти сразу видно).ничего плохого в том, чтобы просто использовать строку, пока она выполняет то, что вы хотите. Если вы просто складываете строки вместе, это легко и отлично работает. Если вы хотите отформатировать другие виды данных, хотя,
stringstreamбудет поддержите это, и строка в основном не будет.
в большинстве случаев вам не понадобится как вход, так и выход в одном и том же потоке строк, поэтому используйте
std::ostringstreamиstd::istringstreamявно делает ваше намерение ясным. Это также предотвращает случайный ввод неверного оператора (<<vs>>).когда вам нужно выполнить обе операции в одном потоке, вы, очевидно, будете использовать версию общего назначения.
проблемы с производительностью были бы наименьшей из ваших проблем здесь, ясность является главным преимущество.
наконец, нет ничего плохого в использовании строки добавить, как вы должны построить чистые строки. Вы просто не можете использовать это для объединения чисел, как вы можете в таких языках, как perl.
istringstream предназначен для ввода, ostringstream для вывода. stringstream-это вход и выход. Вы можете использовать stringstream практически везде. Однако, если вы передадите свой объект другому пользователю, и он использует оператор >>, тогда как вы ожидаете только объект записи, вы не будете счастливы ; -)
PS: ничего плохого в этом нет, просто проблемы с производительностью.
чтобы ответить на ваш третий вопрос: нет, это совершенно разумно. Преимущество использования потоков заключается в том, что вы можете ввести любое значение, которое имеет
operator<<определено, в то время как вы можете добавлять только строки (либо C++, либо C) в Astd::string.
предположительно, когда для вашей операции подходит только вставка или только извлечение, вы можете использовать одну из версий с префиксом " i " или "o", чтобы исключить нежелательную операцию.
Если это не важно, то вы можете использовать ввода-вывода версии.
конкатенация строк, которую вы показываете, совершенно корректна. Хотя конкатенация с использованием stringstream возможна, это не самая полезная функция stringstreams, которая должна иметь возможность вставлять и извлекать POD и абстрактные типы данных.
зачем открывать файл для чтения и записи, если вам нужно только читать из него, например?
Что делать, если несколько процессов необходимо прочитать из одного файла?
Comments