□ классы istringstream
ostringstream
и iostringstream
работают по схожему принципу. Они помогают создавать строки в памяти, а затем помещают туда данные или считывают их. Создание, конкатенация и преобразование строк
Даже те, кто довольно давно пользовался языком C++ , знают о классе std::string
std::string
— это реальный шаг вперед к простоте и безопасности.Благодаря выходу C++11 теперь даже не нужно копировать строки, когда мы хотим передать право собственности какой-то другой функции или структуре данных, поскольку можем
По мере выхода новых стандартов класс std::string
std::string_view
. Мы немного поработаем с ней (но впереди будет и другой пример, в котором более подробно рассматривается std::string_view
), чтобы понять, как взаимодействовать с подобным инструментарием в эпоху С++17.Как это делается
В этом примере мы создадим строки и строковые представления, а затем выполним простые операции конкатенации и преобразования.
1. Как и обычно, сначала включим заголовочные файлы и объявим об использовании пространства имен std
#include
#include
#include
#include
#include
using namespace std;
2. Сначала создадим объекты строк. Самым очевидным способом является инстанцирование объекта класса string
a
. Помимо этого, вместо инициализации строки с помощью строки в стиле C можно применить оператор строкового литерала ""s
. Он создает объект строк динамически. Мы используем его для создания объекта b
, что позволит применять автоматическое выведение типа.int main()
{
string a { "a" };
auto b ( "b"s );
3. Строки, которые мы только что создали,
string_ view
. Этот класс также имеет оператор литерала, он вызывается с помощью конструкции ""sv
: string_view c { "c" };
auto d ( "d"sv );
4. Теперь поработаем с нашими строками и строковыми представлениями. Для обоих типов существует перегруженная версия оператора <<
std::ostream
, поэтому их удобно выводить на экран: cout << a << ", " << b << '\n';
cout << c << ", " << d << '\n';
5. В классе string
+
, поэтому можно "a" + "b"
даст результат "ab"
. Конкатенация строк a
и b
с помощью данного способа выполняется довольно легко. При необходимости сложить a
и c
могут возникнуть некоторые трудности, поскольку c
— не строка, а экземпляр класса string_view
. Сначала нужно получить строку из c
, это делается путем создания новой строки из c
и сложения ее с a
. Кто-то может задаться вопросом: «Погодите, зачем копировать с в промежуточную строку только для того, чтобы сложить ее с а
? Можно ли этого избежать, использовав конструкцию c.data()
?» Идея хороша, но имеет недостаток: экземпляры класса string_view
не обязаны содержать строки, завершающиеся нулем. Данная проблема может привести к переполнению буфера. cout << a + b << '\n';
cout << a + string{c} << '\n';
6. Создадим новую строку, содержащую все введенные нами строки и строковые представления. С помощью std::ostringstream
std::cout
, но не выводит данные на консоль. Вместо этого он выводит данные в <<
, можем создать и вывести на экран новый объект строки, задействовав конструкцию o.str()
. ostringstream o;
o << a << " " << b << " " << c << " " << d;
auto concatenated (o.str());
cout << concatenated << '\n';