Строковый объект, созданный из строкового класса, представляет собой структуру данных списка. Список представляет собой серию персонажей, и он ценится как таковой. Строковый объект C ++ имеет множество методов. Однако в нем отсутствуют определенные операции, которые лучше всего использовать, если рассматривать его как поток. Вот где на помощь приходит stringstream. Stringstream — это поток, который можно использовать для:
— Подсчитайте количество слов в строковом объекте
— Получить частоту отдельных слов в строковом объекте
— Преобразование слова в текстовой форме в строковом объекте в число и наоборот
Перемещение символов из строкового объекта в программу C ++ является вводом и представлено объектом строкового потока. Выводится перемещение символов из программы C ++ в строковый объект. Stringstream (то есть sstream) использует классы istringstream и ostringstream. Объект, созданный из istringstream, отвечает за ввод символов в поток строк. Объект, созданный из ostringstream, отвечает за вывод символов из строкового потока в строковый объект.
В этом руководстве объясняется, что такое sstream и как его использовать. Целевой строковый объект является частью программы C ++.
Чтобы выполнить ввод, вывод или и то, и другое в одном сеансе, программа на C ++ должна начинаться с:
#include <string>
#include <sstream>
#include <iostream>
Создание объекта Stringstream
Известно, что строковый поток может быть объявлен и применен одновременно в одном операторе. Однако в данном руководстве это не тот подход. В этом руководстве объект строкового потока создается из класса в одном операторе и используется в другом операторе.
Stringstream может быть создан для чтения (ввода). Stringstream может быть создан для записи (вывода). Stringstream может быть реализован как для чтения и записи.
Чтобы создать объект потока для чтения, используйте:
sstream strm (ios_base::in);
где strm — объект потока; а «in» класса ios_base означает чтение.
Чтобы создать объект потока для записи, используйте:
sstream strm (ios_base::out);
где strm — объект потока; а «вне» класса ios_base означает запись.
Чтобы создать объект потока для чтения или записи, используйте:
sstream strm (ios_base::in | ios_base::out);
где «ios_base :: in | ios_base :: out », предназначен для чтения или записи.
Входная операция Stringstream
Текст для ввода в строковый поток из строкового объекта может быть выполнен двумя способами: с помощью оператора вставки (<<) или с помощью функции-члена str () класса sstream. Следующая программа иллюстрирует это для обоих способов:
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream strm1(ios_base::in);
strm1 << «We are the world!»;
string stri2 = «This is the earth!»;
stringstream strm2(ios_base::in);
strm2 << stri2;
stringstream strm3(ios_base::in);
strm3.str(«Mars is next.»);
string stri4 = «What about Jupiter?»;
stringstream strm4(ios_base::in);
strm4.str(stri4);
return 0;
}
Строковый объект может быть литералом или идентификатором. Обратите внимание, что в объявлении объекта sstream используется «stringstream», а не «sstream», хотя оба термина означают одно и то же. В директиве include следует использовать термин sstream.
Выходная операция Stringstream
Слово — это любой строковый текст, в котором нет пробела (’’). Вывод из строкового потока означает отправку строкового слова из объекта sstream в строковый объект. Для этого нужен оператор извлечения (>>). Следующая программа отправляет слово из объекта sstream в строковый объект:
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream strm;
strm << «love»;
string stri = «hate»;
strm >> stri;
cout << stri << endl;
return 0;
}
Результат:
love
Любое строковое значение, которое могло быть у строкового объекта, заменяется. Если поток строк объявлен выше и без каких-либо аргументов, то он предназначен для ввода или вывода.
Если в строковом значении объекта строкового потока (буфера) есть пробелы, то будет отправлено только первое слово. Функция-член sstream, str (), должна использоваться для отправки всего строкового значения, включая пробелы. Str () может использоваться для преобразования строкового литерала в содержимое sstream. Его также можно использовать для возврата всего содержимого буфера потока, включая пробелы, в строковый объект. Следующая программа иллюстрирует это:
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream strm;
strm << «I love her, but he hates her.»;
string stri;
stri = strm.str();
cout << stri << endl;
return 0;
}
Результат:
I love her, but he hates her.
Отправка первых нескольких слов в переменные
В строке
«Я люблю ее, но он ее ненавидит».
Если первые 5 слов должны быть представлены переменными a, b, c, d, e, то эти переменные можно сделать так, чтобы они содержали слова. Следующий код иллюстрирует это:
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream strm;
strm << «I love her, but he hates her.»;
string a, b, c, d, e;
strm >> a >> b >> c >> d >> e;
cout << a << ‘ ‘ << b << ‘ ‘ << c << ‘ ‘ << d << ‘ ‘ << e << endl;
return 0;
}
Результат:
I love her, but he
Отдельный символ — это слово. Обратите внимание, что запятая была соединена со словом «она». Если бы запятая была отделена от «ее», то это считалось бы отдельным словом.
Подсчет количества слов в строковом литерале
В предыдущем разделе были идентифицированы только первые 5 слов. Чтобы передать все слова в разные переменные, необходимо знать количество слов. Если проблема заключается только в том, чтобы узнать количество слов в буфере sstream, то это можно сделать в цикле while. Он заключается в отправке всех слов в одну переменную, при подсчете количества раз, когда выполняется отправка, и до тех пор, пока не будет достигнут конец потока (конец файла). Следующий код иллюстрирует это:
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream strm;
strm << «I love her, but he hates her.»;
int counter = 0;
string temp;
while (!strm.eof()) {
strm >> temp;
counter += 1;
}
cout << counter << endl;
return 0;
}
Выход 7. Точка ставится на второй «ней». Обратите внимание, что индикатором конца файла является функция-член sstream, eof ().
Частоты отдельных слов
В строковом значении
«I love her, and he loves her sister, though he hates her brother.»
Слово «она» встречается 3 раза, и частота «ее» указывается равной 3. Слово «он» встречается 2 раза, а частота «он», как говорят, равна 2. слова имеют частоту 1 каждое. Частоту каждого слова можно определить следующим образом:
Имейте все слова на карте C ++ без повторения. Рассмотрим следующее утверждение:
mp[temp]++;
где mp — объект карты. В первый раз, когда этот оператор встречается в цикле while, он вписывается в новую пару ключ / значение, ключ которой является строковым словом переменной temp, а значение равно 1. В следующий раз, когда он встречается в том же цикле while- цикл, с этим конкретным ключом на карту не добавляется новая пара ключ / значение. Значение этой пары ключ / значение просто увеличивается.
Итак, стратегия состоит в том, чтобы этот оператор находился в цикле while, а все слова в буфере ssstream считывались во временную переменную. И каждое значение для каждой пары ключ / значение на карте, наконец, становится частотой ключа (слова). Следующая программа иллюстрирует это:
#include <string>
#include <sstream>
#include <map>
#include <iostream>
using namespace std;
int main()
{
stringstream strm;
strm << «I love her and he loves her sister, though he hates her brother.»;
string temp;
map<string, int> mp;
while (strm >> temp) {
mp[temp]++ ;
}
for (map<string, int>::iterator it = mp.begin(); it != mp.end(); it++)
cout << it—>first << » => « << it—>second << endl;
return 0;
}
Результат:
I => 1
and => 1
brother. => 1
hates => 1
he => 2
her => 3
love => 1
loves => 1
sister, => 1
though => 1
Строка в число и наоборот
Строка в число
Чтобы преобразовать строковое слово в число, просто отправьте строковое слово из буфера sstrream в переменную, объявленную как число. Чтобы преобразовать в int, отправьте строковое слово в переменную типа int. Чтобы преобразовать в число с плавающей запятой, отправьте строковое слово в переменную с плавающей запятой. Следующая программа иллюстрирует это:
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream strm;
strm << » 30 «;
int myInt;
strm >> myInt;
int intResult = myInt + 10;
cout << intResult << endl;
strm << » 2.5 «;
float myfloat;
strm >> myfloat;
float fltResult = myfloat + 0.3;
cout << fltResult << endl;
return 0;
}
Результат:
40
2.8
Число в строку
Чтобы преобразовать число в строковое слово, просто отправьте число в буфер sstream. Затем считайте буфер потока в строковый объект. Чтобы преобразовать int в строку, отправьте целое число в поток sstream. Чтобы преобразовать число с плавающей запятой в строку, отправьте его в поток sstream. Следующая программа иллюстрирует это:
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream strm1;
int myInt = 30;
strm1 << myInt;
string intStr;
strm1 >> intStr;
string intStrRes = intStr + » good»;
cout << intStrRes << endl;
stringstream strm2;
float myflt = 2.5;
strm2 << myflt;
string fltStr;
strm2 >> fltStr;
string fltStrRes = fltStr + » yes»;
cout << fltStrRes << endl;
return 0;
}
Результат:
30 good
2.5 yes
Здесь используются два объекта потока для разных числовых типов.
Примечание : буфер sstream состоит только из символов.
Заключение
Stringstream означает String Stream. Он также записывается как sstream. Это ручей. Целью этого потока является строковый объект. В потоке можно использовать оператор вставки (<<) и оператор извлечения (>>). Поток очень полезен для следующих целей: подсчет количества слов в строковом объекте, получение частот отдельных слов в строковом объекте и преобразование слова в текстовой форме в строковом объекте в число и наоборот.