0


功能强大的stringstream类

🌼🌼前言:在 C++ 的编程世界里,**

  1. stringstream

是一个极为重要且实用的工具,它为字符串处理提供了强大的功能。然而,在使用

  1. stringstream

**时,有诸多细节需要我们仔细留意,才能充分发挥其优势并避免潜在的错误。

一、stringstream 概述

**

  1. stringstream

是 C++ 标准库

  1. <sstream>

**中的一个类,它允许我们像操作流一样操作字符串。这意味着我们可以方便地进行字符串与其他数据类型之间的转换、字符串的拼接、分割等一系列操作,极大地提高了字符串处理的灵活性和效率。

使用时需要包含头文件**#include<sstream>**

二、stringstream的创建

1.构造函数的细节

**

  1. stringstream

**拥有多种构造函数,其中两个较为常用的构造函数有着明显的区别:

无参构造函数:

1. 创建一个对象,向对象输入字符串:

  1. // 创建一个 string类 对象 s
  2. string s("hello stringstream");
  3. // 创建一个 stringstraeam类 对象 ss
  4. stringstream ss;
  5. // 向对象输入字符串 : "<<" 表示向一个对象中输入
  6. ss << s;
  7. cout << ss.str() << endl;

输出如下:

需要注意的是:stringstream类没有重载 (operator<<),这一点与string类不同,string类可以直接通过cout<< string ("1234")<<endl;输出。stringstream则是通过**str()**函数,该函数返回了一个字符串,进行输出。

2. 在创建对象的时候使用字符串初始化:

  1. // 创建一个 stringstraeam类 对象 ss
  2. stringstream ss("hello stringstream");
  3. cout << ss.str() << endl;

2.字符串拼接覆盖功能

2.1.基于默认构造函数的拼接

当使用默认构造函数创建**

  1. stringstream

**对象,如

  1. s**tringstream ss;**

时,后续通过多次使用**

  1. <<

**操作符输入字符串,这些字符串会依次拼接在一起。

例如:

  1. #include <iostream>
  2. #include <sstream>
  3. int main() {
  4. stringstream ss;
  5. ss << "Hello";
  6. ss << " ";
  7. ss << "World";
  8. std::cout << ss.str() << std::endl;
  9. return 0;
  10. }
  11. //输出Hello world

在上述代码中:

  • 首先创建了一个空的s**tringstream**对象ss
  • 然后通过**连续的<<操作符,依次将字符串"Hello"" "(空格)和"World"**输入到ss中。
  • 最后调用**ss.str()获取拼接好的完整字符串,并通过cout输出,输出结果为Hello World。**

这种方式适用于在程序运行过程中,根据不同的逻辑逐步拼接生成一个完整的字符串的场景。

2.2 基于带初始字符串构造函数的拼接(覆盖式拼接)

若使用带初始字符串的构造函数创建**

  1. stringstream

对**象,如

  1. **stringstream ss("Initial String")**;

,后续再使用**

  1. <<

操作符输入新字符串时,新字符串会从起始位置开始覆盖原有字符串的内容,直到新字符串输入完毕。**

  1. #include <iostream>
  2. #include <sstream>
  3. int main() {
  4. stringstream ss("Bas xuwen ");
  5. ss << "New ";
  6. std::cout << ss.str() << std::endl;
  7. ss<<"hello world"
  8. std::cout << ss.str() << std::endl;
  9. return 0;
  10. }

如果想要在这种构造方式下实现类似追加的拼接效果,可以先将原字符串保存起来,再结合**

  1. <<

**操作符进行拼接操作。比如:

  1. #include <iostream>
  2. #include <sstream>
  3. int main() {
  4. stringstream ss("Base");
  5. string original = ss.str();
  6. ss.str(""); // 清空当前内容
  7. ss << original;
  8. ss << " New";
  9. std::cout << ss.str() << std::endl;
  10. return 0;
  11. }

在上述修改后的代码中:

  • 先创建了初始化为"Base"stringstream对象ss,并将其初始字符串保存到original变量中。
  • 然后通过ss.str("");清空ss的当前内容,以便后续重新拼接。
  • 接着先将保存的原字符串original重新输入到ss中,再通过<<操作符输入新字符串" New",这样就实现了类似追加的拼接效果,最终输出结果为Base New

三. stringstream在LeetCode的常见用法

1.默认空格分割:便捷的基础用法

**原理:

  1. stringstream

在默认情况下,会以空格作为分隔符来分割字符串。这是因为

  1. stringstream

的设计目的之一是方便地处理文本流,而在很多文本处理场景中,单词之间是以空格来分隔的。当使用

  1. >>

操作符从

  1. stringstream

**中提取数据时,它会自动跳过空格,直到遇到下一个非空格字符,然后开始读取字符,直到再次遇到空格或者到达字符串末尾。

简单来说:stringstream可以通过重载operator>>将自己的数据从左到右输出输出的数据自己将不在拥(这可不是拷贝)(像money一样越花,钱越少😀😀)。空格作为标识符代表这一次输出结束。

  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4. int main()
  5. {
  6. std::string input = "Hello world how are you";
  7. std::stringstream ss(input);
  8. std::string word;
  9. while (ss >> word)
  10. {
  11. std::cout << word << std::endl;
  12. }
  13. return 0;
  14. }
  1. Hello
  2. world
  3. how
  4. are
  5. you

与其他分割方式对比

与手动分割字符串相比,**

  1. stringstream

的空格分割功能更加方便。例如,如果要手动实现空格分割,可能需要编写复杂的循环来遍历字符串,判断每个字符是否为空格,然后提取单词。而

  1. stringstream

**则简化了这个过程。

与**string使用

  1. strtok

**函数(C 风格的字符串分割函数)相比,

  1. stringstream

是面向对象的 C++ 方式,更符合 C++ 的编程风格。

  1. strtok

函数会修改原始字符串,并且在多线程环境下可能会出现问题,而

  1. stringstream

不会修改原始字符串,并且可以在更复杂的 C++ 程序中方便地与其他流操作结合使用。

2.类型转换

从字符串到基本数据类型的转换

整数类型转换

**

  1. stringstream

**可以方便地将字符串转换为整数类型。例如,将一个表示数字的字符串转换为

  1. int

类型。假设我们有一个字符串**

  1. "123"

,可以使用

  1. stringstream

**进行转换

  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4. int main()
  5. {
  6. std::string numStr = "123";
  7. int num;
  8. std::stringstream ss(numStr);
  9. ss >> num;
  10. std::cout << "转换后的整数为: " << num << std::endl;
  11. return 0;
  12. }

  • 在这个示例中,首先创建了一个包含数字字符串**"123"string对象numStr。然后创建了stringstream对象ss并使用numStr进行初始化。接着使用ss >> num**操作,stringstream会尝试从字符串中提取整数并存储到num变量中。最后输出转换后的整数123

浮点数类型转换

对于将字符串转换为浮点数(**如

  1. float

  1. double

)**,过程与整数转换类似。例如,将字符串

  1. "3.14"

转换**为

  1. double

**类型

  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4. int main()
  5. {
  6. std::string floatStr = "3.14";
  7. double num;
  8. std::stringstream ss(floatStr);
  9. ss >> num;
  10. std::cout << "转换后的浮点数为: " << num << std::endl;
  11. return 0;
  12. }

  • 这里同样先创建字符串,然后通过**stringstream提取浮点数到num变量中,输出结果为3.14**。
  • 注意事项: - 当进行字符串到数字类型的转换时,如果字符串格式不符合数字类型的要求,转换将会失败。例如,如果尝试将"abc"转换为整数,stringstream会进入错误状态,转换后的变量值将是不确定的。可以通过检查stringstream的状态来判断转换是否成功。例如,if(ss.good())表示转换成功,if(ss.fail())表示转换失败。
从基本数据类型到字符串的转换
  • 整数转换为字符串

  • 可以将整数等基本数据类型转换为字符串。例如,将整数**42**转换为字符串:

  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4. int main()
  5. {
  6. int num = 42;
  7. std::stringstream ss;
  8. ss << num;
  9. std::string numStr = ss.str();
  10. std::cout << "转换后的字符串为: " << numStr << std::endl;
  11. return 0;
  12. }

在这个示例中,首先创建了整数变量**

  1. num

并赋值为

  1. 42

。然后创建

  1. stringstream

对象

  1. ss

,通过

  1. ss << num

将整数

  1. num

输入到

  1. stringstream

中。最后使用

  1. ss.str()

**获取转换后的字符串并存储到

  1. numStr

变量中,输出结果为**

  1. "42"

**。

四 .习题实践

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

  1. 反转字符串中的单词 - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. string reverseWords(string s)
  4. {
  5. string res,temp;
  6. stringstream ss(s);
  7. while(ss>>temp)
  8. {
  9. res = temp + " " + res;
  10. }
  11. if(!res.empty())
  12. {
  13. res.pop_back();
  14. }
  15. return res;
  16. }
  17. };
  1. 两句话中的不常见单词

  1. class Solution {
  2. public:
  3. vector<string> uncommonFromSentences(string s1, string s2) {
  4. stringstream ss;
  5. ss<<s1<<' '<<s2;
  6. string s;
  7. unordered_map<string,int> mp;
  8. while(ss>>s)
  9. {
  10. mp[s]++;
  11. s="";
  12. }
  13. vector<string> v;
  14. for(auto& ch:mp)
  15. {
  16. if(ch.second==1)
  17. {
  18. v.push_back(ch.first);
  19. }
  20. }
  21. return v;
  22. }
  23. };
  1. 总结:(看到这里,很了不起🚀🚀)

**

  1. stringstream

**在 C++ 字符串处理中功能强大且灵活,无论是字符串拼接、分割还是类型转换,都能在不同场景下发挥重要作用,帮助开发者高效处理字符串相关任务,尤其是涉及复杂数据处理和转换的情况,是 C++ 编程中处理字符串的得力工具。

** 松树千年终是朽,槿花一日自为荣😊☺**

标签: 算法 c++

本文转载自: https://blog.csdn.net/2401_83603768/article/details/144012486
版权归原作者 藤椒味的火腿肠真不错 所有, 如有侵权,请联系我们删除。

“功能强大的stringstream类”的评论:

还没有评论