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



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



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



std::string stHehe("Hello ");

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

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) в A std::string.

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

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

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

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

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

Comments

    Ничего не найдено.