Я просматриваю библиотеку sstream и наткнулся на stringstream. Погуглив, я пришел к выводу, что это то же самое, что и строка, но я не могу этого понять.
Насколько я понимаю, это создать строку и использовать ее как "cin" для конкатенации?
#include <string> // std::string
#include <iostream> // std::cout
#include <sstream> // std::stringstream
int main () {
std::stringstream ss;
ss << 100 << ' ' << 200;
int foo,bar;
ss >> foo >> bar;
std::cout << "foo: " << foo << '\n';
std::cout << "bar: " << bar << '\n';
return 0;
}
Грубо говоря, a
stringstream
— это буфер в памяти, который притворяется, что ведет себя как файл. Просто и легко.Он допускает те же операции, что и поток , но не привязан к какому-либо физическому устройству ;
В то время как поток не разрешает доступ к базовому физическому устройству, строковый поток разрешает доступ к потоку , который он использует в качестве буфера , через операции
чтобы получить копию буфера и
установить его самостоятельно.
Потоки являются выходными и/или входными буферами. Через них представлен более или менее унифицированный интерфейс, позволяющий однородно обращаться к разным источникам данных.
Вы можете использовать выходной поток для хранения данных в файле, для записи той же самой информации на экран или для вывода ее на принтер, и то же самое верно для входных потоков .
stringstream
это поток , работающий во внутреннем буфере. Он не записывает в файлы и не читает с клавиатуры. То, что вы отправляете в этот поток , попадает в память. Для чего это? В основном для внутреннего использования.Вместо этого класс
string
физически представляет строку символов, а его интерфейс предназначен для хранения строк символов и управления ими.Некоторые различия между обоими классами:
string
у вас нет перегруженного оператора вставки/удаления. Если это не буфер, ему не нужно вести себя как таковой.string
он не может преобразовывать собственные типы.stringstream
не имеет итераторов. Буфер — это хранилище информации, чтобы использовать его, сначала его нужно распаковать. Эта функция не позволяет использовать его напрямую с подавляющим большинством функций STL.stringstream
не поддерживает явное изменение размера своего внутреннего буфера.stringstream
в другой буфер. Для этого вам необходимо извлечь его содержимое (например, с помощьюtoString()
метода ).iomanip
применимы с ,stringstream
но не сstring
.В
stringstream
основном используются для операций форматирования надstring
s, так же какfstream
s для файлов.Вы можете использовать все функторы, которые
iostream
s должны манипулировать потоком, такие как числа ввода/вывода (std::hex
,std::scientific
, и т. д.), строки (std::quoted
), заполнение (std::setw,std::setfill
), настройки местоположения (.imbue()
,std::put_money
) и т. д.Другими словами, если
iostream
вместе с его перегрузкамиoperator<</>>
s это альтернатива C++ дляprintf
,fstream
то этоfprintf
, иstringstream
этоsprintf
, а также типобезопасный и с гораздо более удобным синтаксисом, а также итерируемый (std::istream_iterator
иstd::ostream_iterator
, чтобы иметь возможность использовать потоки, как если бы они были контейнерами).