Класс stringstream в C++ позволяет рассматривать строковый объект как поток. Он используется для работы со строками. Рассматривая строки как потоки, мы можем выполнять операции извлечения и вставки из/в строку так же, как потоки cin и cout.
Эти типы операций в основном полезны для преобразования строк в числовые типы данных и наоборот. Класс stringstream также оказывается полезным в различных типах синтаксического анализа.
Класс stringstream
Графически класс stringstream можно представить следующим образом:
Вы можете видеть, где класс stringstream появляется на диаграмме ios. Этот класс является производным от класса iostream. Объекты класса stringstream используют строковый буфер, содержащий последовательность символов. К этому буферу можно обращаться напрямую как к строковому объекту.
Для этой цели мы можем использовать элемент str строкового потока. Чтобы использовать класс stringstream в программе C++, мы должны использовать заголовок <sstream>.
Например, код для извлечения целого числа из строки будет таким:
string mystr(“2022”); int myInt; stringstream (mystr)>>myInt; |
Здесь мы объявляем строковый объект со значением «2022» и целочисленный объект «myInt». Затем мы используем конструктор класса stringstream для создания объекта stringstream из объекта string. После, с помощью оператора извлечения (>>) значение извлекается в myInt. Из приведенного выше кода значение myInt будет 2022.
Давайте рассмотрим различные операции класса stringstream.
Операции вставки и извлечения с использованием stringstream
Теперь мы покажем, как вставить данные в поток строк и как получить данные из потока строк, то есть операцию извлечения класса потока строк.
1) Операция вставки
Чтобы вставить данные в строковый поток, мы можем использовать два метода:
Использование оператора вставки (<<)
Имея объект stringstream ss, мы можем присвоить данные буферу ss следующим образом, используя оператор <<.
stringstream ss; ss<< “hello,world!!”; |
Здесь мы вставили «hello,world!!» в stringstream ss.
Использование функции str(string)
Мы также можем использовать функцию str для присвоения данных буферу строкового потока. Функция str принимает строку данных в качестве аргумента и присваивает эти данные объекту stringstream.
stringstream ss; ss.str(“Hello,World!!”); |
2) Операция извлечения
Также есть два метода для получения данных из строкового потока или для операции извлечения:
Использование функции str()
Мы можем использовать функцию str() для получения данных из строкового потока следующим образом:
stringstream ss; ss<<”Hello,World”; cout<<ss.str(); |
Использование оператора извлечения (>>)
Мы можем использовать оператор извлечения для отображения данных строкового потока следующим образом:
Stringstream ss; ss<< “stringstream”; string str; ss>>str; |
В соответствии с приведенным выше кодом переменная str будет иметь значение объекта ss в результате действия оператора извлечения.
Ниже приведена полная программа, демонстрирующая использование операций вставки и извлечения класса stringstream:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <sstream> #include<string> using namespace std; int main() { //insertion operator << stringstream os; os << "Monitor "; cout<<os.str(); //str(string) function to read input os.str("BankRu"); //str() function for extraction cout<<os.str()<<endl; //extraction operator (>>) stringstream ss; ss<<"10 07 2022"; string mystr1; ss >> mystr1; string mystr2; ss>>mystr2; string mystr3; ss>>mystr3; cout<<mystr1<< "/"<<mystr2<<"/"<<mystr3; } |
Вывод данных:
Monitor BankRu 10/07/2022 |
В приведенной выше программе мы сначала показали методы вставки, т.е. оператор << и функцию str(string), которая считывает строку в stringstream.
Далее мы показали работу методов извлечения, которые представляют собой функцию str(), извлекающую данные из потока строк, и оператор >>.
Обратите внимание, что для оператора >>, поскольку исходные данные строкового потока состоят из пробелов, при назначении данных строковой переменной он будет считываться только до первого пробела. Следовательно, чтобы преобразовать весь объект stringstream в строковые данные, нам нужна одна переменная для чтения данных, разделенных пробелами.
Следовательно, в приведенной выше программе нам нужны три строковые переменные, чтобы получить все данные объекта строкового потока.
Применение stringstream в C++
Вот где мы можем найти применение класса stringstream:
1) Преобразование между строками и числами
Операторы вставки и извлечения строкового потока работают со всеми основными типами данных. Следовательно, мы можем использовать их для преобразования строк в числовые типы и наоборот.
Полная программа преобразования между строками и числами приведена ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> #include <sstream> #include <string> using namespace std; int main() { //Numeric to string stringstream ss; int nInt = 2022; double nDouble = 3.142; ss << nInt << " " << nDouble; string myStr1, myStr2; ss >> myStr1 >> myStr2; cout<<"The numeric values converted to string:"<<endl; cout << "myStr1 = "<<myStr1 << " " << "myStr2 = "<<myStr2 << endl; //string to numeric stringstream ns; ns << "2022 3.142"; // вставьте строку чисел в поток int nIntval; double nDoubleval; ns >> nIntval >> nDoubleval; cout<<"The string values converted to numeric types:"<<endl; cout << "nIntval = "<<nIntval << " " <<"nDoubleval = "<< nDoubleval << endl; } |
Вывод данных:
The numeric values converted to string: myStrl = 2022 myStr2 = 3.142 The string values converted to numeric types: nIntval = 2022 nDoubleval = 3.142 |
Во-первых, мы преобразовали числовые значения в строковые значения. Затем мы преобразуем числовые строковые значения в числовые значения.
2) Подсчет количества слов в строке
Мы можем использовать класс stringstream для подсчета количества слов в строке. Полная программа представлена ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <sstream> #include <string> using namespace std; int main() { string str = "We are glad to welcome you to the MonitorBank website"; stringstream s(str); string word; int count = 0; while (s >> word) count++; cout << " Number of words in given string are: " << count; return 0; } |
Вывод данных:
Number of words in given string are: 10 |
Чтобы подсчитать количество слов в заданной строке, мы сначала преобразуем ее в объект stringstream. Затем мы подсчитываем каждое слово, используя оператор извлечения (поскольку он останавливается на каждом пробеле) в цикле. Наконец, мы печатаем значение общего количества слов.
3) Вывод частотности слов в строке
Следующим применением stringstream в C++ является вывод частотности различных слов в заданной строке. Это означает, что мы будем видеть, сколько раз конкретное слово встречается в данной строке.
Для этого мы сохранили структуру карты, которая будет иметь пару ключ-значение с каждым словом в строке в качестве ключа, а его соответствующее значение — это частота этого конкретного слова.
Полная программа C++ показана ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream> #include <sstream> #include <string> #include <map> using namespace std; int main() { string mystr = "We are glad to welcome you to the MonitorBank website "; map<string, int> myMap; stringstream ss(mystr); string Word; while (ss >> Word) myMap[Word]++; map<string, int>::iterator it; for (it = myMap.begin(); it != myMap.end(); it++) cout << it->first << " -> " << it->second << "\n"; return 0; } |
Вывод данных:
We -> 1 are -> 1 glad -> 1 to -> 2 welcome -> the -> 1 you -> 1 MonitorBank -> 1 website -> 1 |
В этой программе каждое слово в строке заносится в карту, а затем количество или частота каждого слова записывается как значение для соответствующего ключа в карте. Таким образом мы выводим все слова строки и соответствующую им частотность.
Итог
Класс Stringstream используется для вставки и извлечения данных в/из строковых объектов. Он действует как поток для строкового объекта. Класс stringstream подобен потокам cin и cout, за исключением того, что у него нет канала ввода-вывода.
Мы обсудили различные операции класса stringstream, а также несколько примеров его применения в программировании.
В нашей следующей статье мы подробно обсудим несколько функций заголовка IOMANIP для управления выводом программ C++, таких как setprecision и setw.
С Уважением, МониторБанк