C++ stringstream类深度剖析与应用全解

文章标题:

C++ stringstream类的深入剖析与应用全方位解读

文章内容:

目录

一、引言

二、stringstream究竟是什么?

三、stringstream的使用方法

✨构造函数

✨字符串输出

✨两种构造函数带来的差异

✨修改与清空stringstream的内容

四、stringsteam的应用场景

✨利用stringstream去除字符串中的空格

✨借助stringstream按指定字符分割字符串

✨类型转换操作

五、常见面试题目

✨计算字符串中的单词数量:

✨反转字符串中的单词(重点)

六、共同勉励


一、引言

相信大家在做LeetCode算法题时,常常会碰到使用stringstream类来处理字符串的情况。由于自身对这个类了解不够深入,于是查阅资料进行整理记录。本文将通过收集的资料对其进行总结,主要讲解如何运用stringstream来解决算法练习或竞赛中遇到的输入输出问题。

二、stringstream究竟是什么?

stringstream是C++中专门用于处理字符串的输入输出流类。

  • 简单提一下C++里“流”的概念。在C++中,把数据从一个对象流向另一个对象的过程抽象为“流”。流在使用前要创建,使用完要销毁。数据的输入和输出是通过I/O流来实现的,cin和cout是C++预先定义好的流类对象。
C++ stringstream类深度剖析与应用全解
  • stringstream定义在头文件<sstream>中,它实际上是一个别名,具体定义如下:
typedef basic_stringstream<char> stringstream;
  • 类模板std::basic_stringstream实现了基于字符串的流上的输入输出操作。它相当于内部存储一个std::basic_string的实例,并在此基础上进行输入输出操作。继承关系图如下:
C++ stringstream类深度剖析与应用全解

三、stringstream的使用方法

✨构造函数

  • stringstream有多种构造函数,这里介绍最常用的两种:

1. 创建对象并向其输入字符串:

    // 创建一个string类对象s
    string s("hello stringstream");
    // 创建一个stringstraeam类对象ss
    stringstream ss;

    // 向对象输入字符串:"<<"表示向对象中输入内容
    ss << s;
    cout << ss.str() << endl;
C++ stringstream类深度剖析与应用全解

2. 创建对象时用字符串初始化:

    // 创建一个stringstraeam类对象ss
    stringstream ss("hello stringstream");

    cout << ss.str() << endl;
C++ stringstream类深度剖析与应用全解

两种构造方式创建的对象用法不同,后续示例会详细说明。

✨字符串输出

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

*/
C++ stringstream类深度剖析与应用全解

四、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
*/
C++ 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
<!>
*/
C++ stringstream类深度剖析与应用全解

上述代码以逗号作为分割依据分割字符串,同理可扩展到其他字符。

✨ 类型转换

使用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;
}

✨ 反转字符串中的单词 (重点)

链接:151. 反转字符串中的单词

C++ stringstream类深度剖析与应用全解
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类的理解,大家持续关注我呀!!!
C++ stringstream类深度剖析与应用全解

版权声明:程序员胖胖胖虎阿 发表于 2025年7月10日 上午5:06。
转载请注明:C++ stringstream类深度剖析与应用全解 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...