文章标题:
C++ stringstream类的深入剖析与应用全方位解读
文章内容:
目录
一、引言
二、stringstream究竟是什么?
三、stringstream的使用方法
✨构造函数
✨字符串输出
✨两种构造函数带来的差异
✨修改与清空stringstream的内容
四、stringsteam的应用场景
✨利用stringstream去除字符串中的空格
✨借助stringstream按指定字符分割字符串
✨类型转换操作
五、常见面试题目
✨计算字符串中的单词数量:
✨反转字符串中的单词(重点)
六、共同勉励
一、引言
相信大家在做LeetCode算法题时,常常会碰到使用stringstream类来处理字符串的情况。由于自身对这个类了解不够深入,于是查阅资料进行整理记录。本文将通过收集的资料对其进行总结,主要讲解如何运用stringstream来解决算法练习或竞赛中遇到的输入输出问题。
二、stringstream究竟是什么?
stringstream是C++中专门用于处理字符串的输入输出流类。
- 简单提一下C++里“流”的概念。在C++中,把数据从一个对象流向另一个对象的过程抽象为“流”。流在使用前要创建,使用完要销毁。数据的输入和输出是通过I/O流来实现的,cin和cout是C++预先定义好的流类对象。

stringstream
定义在头文件<sstream>
中,它实际上是一个别名,具体定义如下:
typedef basic_stringstream<char> stringstream;
- 类模板
std::basic_stringstream
实现了基于字符串的流上的输入输出操作。它相当于内部存储一个std::basic_string
的实例,并在此基础上进行输入输出操作。继承关系图如下:

三、stringstream的使用方法
✨构造函数
stringstream
有多种构造函数,这里介绍最常用的两种:
1. 创建对象并向其输入字符串:
// 创建一个string类对象s
string s("hello stringstream");
// 创建一个stringstraeam类对象ss
stringstream ss;
// 向对象输入字符串:"<<"表示向对象中输入内容
ss << s;
cout << ss.str() << endl;

2. 创建对象时用字符串初始化:
// 创建一个stringstraeam类对象ss
stringstream ss("hello stringstream");
cout << ss.str() << endl;

两种构造方式创建的对象用法不同,后续示例会详细说明。
✨字符串输出
stringstream
要输出内部存储的字符串,需调用str()
函数,不能直接输出:
std::cout << ss.str() << std::endl;
// std::cout << ss << std::endl; // 错误,不能直接输出
注意:
cout << ss << endl;
这种写法是错误的,不能直接输出。
✨两种构造函数带来的差异
前面介绍了两种构造函数,用不同构造函数创建的对象操作也不一样:
1. 第一种构造方式
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
stringstream ss1;
ss1 << "fre";
ss1 << "gre";
cout << ss1.str() << endl;
return 0;
}
/*
输出:
fregre
*/
可以看到,两个字符串直接拼接在一起了。
2. 第二种构造方式
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
string str("asd");
// 第二种构造
stringstream ss2(str);
cout << ss2.str() << endl;
// 第一种构造
ss2 << "r";
cout << ss2.str() << endl;
ss2 << "13";
cout << ss2.str() << endl;
ss2 << "hy";
cout << ss2.str() << endl;
return 0;
}
/*
输出:
asd
rsd
r13
r13hy
*/
可以发现,用第一种构造函数创建对象时,输入字符串后直接进行字符串拼接,而第二种构造方式,进行字符串拼接时,会先覆盖原来的字符串,然后再拼接。
如果不想原来的字符串被覆盖,可以换一种构造方式,如下:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
ostringstream ss("1 2 3 4 ", std::ios_base::ate); // append方式追加
cout << ss.str() << endl;
ss << "5 3 4";
cout << ss.str() << endl;
return 0;
}
/*
输出:
1 2 3 4
1 2 3 4 5 3 4
*/
✨修改、清空 stringstream 内容
stringstream
的内容可以通过str()
函数进行修改和清空:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
stringstream ss("hello string");
cout << ss.str() << endl;
// 修改内容
ss.str("hello stringstream");
cout << ss.str() << endl;
// 清空内容
ss.str("");
cout << ss.str() << endl;
return 0;
}
/*
输出:
fghewoo
123456
*/

四、stringsteam的应用场景
✨ 利用 stringstream 去除字符串空格
stringstream
默认以空格来分割字符串,利用它去除字符串空格很方便:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
stringstream ss("hello string and stringstream");
cout << ss.str() << endl;
cout<< endl;
string str;
// 注意:stringstream是一个单词一个单词“流入”string的
while (ss >> str)
{
cout << str << endl;
}
return 0;
}
/*
输出:
hello string and stringstream
hello
string
and
stringstream
*/

✨ 利用 stringstream 指定字符分割字符串
前面说了利用stringstream
去除字符串空格是利用空格分割,同样也能指定其他字符分割字符串,这需要配合getline()
函数使用,下面以逗号分割字符串为例:
getline 详解:
getline()
的原型是istream & getline ( istream &is , string &str , char delim );
- 其中
istream &is
表示一个输入流,比如可以用cin; string str ; getline(cin ,str)
- 也可以用stringstream,比如
stringstream ss("test#") ; getline(ss,str)
char delim
表示遇到这个字符停止读入,系统默认该字符为'\n'
,也能自定义字符
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
string source = "abc,123,<!>";
stringstream ss(source);
cout << ss.str() << endl;
cout<< endl;
string str;
while (getline(ss, str, ','))
{
cout << str << endl;
}
return 0;
}
/*
输出:
abc,123,<!>
abc
123
<!>
*/

上述代码以逗号作为分割依据分割字符串,同理可扩展到其他字符。
✨ 类型转换
使用stringstream
进行类型转换
- 下面是一个用
stringstream
将数字转为字符串的例子:
#include <sstream>
#include <iostream>
#include <string>
int main() {
int num = 123;
std::stringstream ss;
ss << num; // 将整数放入流中
std::string str = ss.str(); // 使用str()函数从流中提取字符串
std::cout << str << std::endl; // 输出:123
}
- 反过来,将字符串转为数值类型:
#include <sstream>
#include <iostream>
#include <string>
int main() {
std::string str = "456";
std::stringstream ss(str); // 初始化stringstream
int num;
ss >> num; // 从流中提取整数
std::cout << num << std::endl; // 输出:456
}
五、常见面试题目
✨计算字符串中的单词个数:
输入:“hello world c plus plus”
输出:5
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main() {
string str = "hello world c plus plus";
int count = 0;
stringstream ss(str);
string word;
while (ss >> word)
count++;
cout << count << endl;
system("pause");
return 0;
}
✨ 反转字符串中的单词 (重点)

class Solution {
public:
string reverseWords(string s)
{
string res,temp;
stringstream ss(s);
while(ss>>temp)
{
res = temp + " " + res;
}
if(!res.empty())
{
res.pop_back();
}
return res;
}
};
六、共同勉励
以上就是我对stringstream类的理解啦,如果有小伙伴有不懂的地方或者发现问题,欢迎在评论区交流哦,我后续还会继续更新关于C++ vector类的理解,大家持续关注我呀!!!