【C++】stringstream类 最全超详细解析(什么是stringstream? stringstrem有哪些作用? 如何在算法中应用?)

目录

一、前言

二、stringstream 是什么 ? 

 三、stringstream 的用法

 ✨构造函数

 ✨输出字符串

 ✨两种构造函数带来的不同

 ✨修改、清空 stringstream 内容

 四、stringsteam 的用途

✨ 利用 stringstream 去除字符串空格

✨ 利用 stringstream 指定字符分割字符串

✨ 类型转换

五、常考面试题

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

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

六、共勉  


一、前言

       想必大家在做 LeetCode 算法题的时候会经常看到有使用 stringstream 类 处理字符串,由于自己对这个类不是很了解,查了资料在这里记录一下。
       所以本文通过收集资料将其进行总结,主要介绍如何使用 stringstream 处理在算法练习或竞赛中遇到的输入输出问题。

二、stringstream 是什么 ? 

 stringstreamC++  提供的专门用于处理字符串的 输入输出 流类。

  • 这里稍微提一下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 默认是以空格来分割字符串的,利用 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;
}

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

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

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 类的理解,请持续关注我哦!!!    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/478035.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【RPG Maker MV 仿新仙剑 战斗场景UI (六)】

RPG Maker MV 仿新仙剑 战斗场景UI 六 法术战斗窗口代码仿新仙剑效果 法术战斗窗口 这次来水点内容 由于之前已经做过了仿新仙剑的法术及物品窗口因此本次两篇内容&#xff0c;就来水点内容&#xff01;&#xff01;&#xff01; 由于帮助窗口之前已经做过&#xff0c;因此直接…

课程思政元素收集遴选系统|基于JSP技术+ Mysql+Java+ B/S结构的课程思政元素收集遴选系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

CVPR 2024 | 长时舞蹈生成:数秒钟可生成极长的3D舞蹈

论文题目&#xff1a; Transparent Image Layer Diffusion using Latent Transparency 论文链接&#xff1a; https://arxiv.org/abs/2402.17113 代码仓库&#xff1a; GitHub - layerdiffusion/LayerDiffuse: Transparent Image Layer Diffusion using Latent Transparency 目…

PR无法在指定轨道上粘贴

在Adobe Premier Pro 2022中&#xff0c;按照视频教程复制(Ctrl C)、粘贴(Ctrl V)一段视频素材时&#xff0c;不能粘贴到点亮的轨道上&#xff0c;尝试了几次都不行。 最后找到了原因。 在快捷键设置中&#xff0c;发现CtrlV快捷键对应的是&#xff0c;粘贴到同一轨道&…

在线教育资源管理系统|基于JSP技术+ Mysql+Java的在线教育资源管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

一文了解AI长文本工具:Kimi Chat;与ChatGPT比较对比

一文了解AI长文本工具&#xff1a;Kimi Chat&#xff1b;与ChatGPT比较对比 在人工智能领域&#xff0c;ChatGPT、Claude2.1和Kimi Chat都是备受关注的大型模型。它们在文本生成、理解和处理方面展现了强大的能力。本文将深入探讨这三个工具的核心功能、优劣势以及适用场景&am…

人工智能驱动的对话背后的魔力

未来交流革命&#xff1a;了解对话式AI的关键优势 在不断发展的技术世界中&#xff0c;人工智能驱动的对话处于创新的前沿&#xff0c;改变了企业与客户互动和管理关系的方式。 这篇博文深入探讨了对话式人工智能的迷人世界&#xff0c;探讨了其当前的趋势、应用程序以及它在重…

聚焦“新质职校“发展,企业力量赋新能

聚焦"新质职校"发展 一、什么是“新质生产力” 新质生产力自2023年9月被首次提出后&#xff0c;便成为经济热词。在最近的全国“两会”中&#xff0c;新质生产力这一议题引起了广泛关注。新质生产力&#xff0c;作为对传统生产力概念的全面升级&#xff0c;是对当前…

《数字集成电路物理设计》学习笔记(持续更新中)

参考书籍&#xff1a; 《数字集成电路物理设计》pdf下载百度云链接&#xff1a; 链接: https://pan.baidu.com/s/1jOD54q_f9KLhfX6InabTRA?pwd8888 提取码: 8888 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v8的分享 目录 第1章 集…

STM32关于使用定时器触发ADC转换的理解

以STM32 ADC的常规通道为例&#xff08;注入通道类似&#xff09;&#xff1a; 如上图&#xff0c;STM32 ADC的常规通道可以由以上6个信号触发任何一个&#xff0c;我们以使用TIM2_CH2触发ADC1&#xff0c;独立模式&#xff0c;每次仅测一条通道&#xff0c;则ADC的配置如下&am…

个人信息-求职[web前端]

我有近近10年开发及6年的管理经验Web前端,所负责的技术团队经历了 Web 前端几代技术变革&#xff0c;参与了几乎&#xff0c;在性能优化、开发效率、所有前端相关项目工程化架构选型上都有丰厚的产出。在上家致力于数据安全前端的相关工作&#xff0c;专注于Vue.js技术栈来推进…

慎投!新增5本期刊被剔除!数据库期刊目录更新

毕业推荐 SSCI&#xff08;ABS一星&#xff09; • 社科类&#xff0c;3.0-4.0&#xff0c;JCR2区&#xff0c;中科院3区 • 13天录用&#xff0c;28天见刊&#xff0c;13天检索 SCIE&#xff1a; • 计算机类&#xff0c;6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区…

Docker jupyter 容器中添加matplotlib 中文支持

本教程基于 jupyter/datascience-notebook&#xff0c;适用其他容器。 # 查看所有 Docker 容器 docker ps -a # 进入已经运行的 Jupyter 容器 docker exec -it CONTAINER_ID bash 本例中CONTAINER_ID为2e # 切换到 matplotlib 的字体目录&#xff08;find / -name "…

基于springboot+vue的民族婚纱预定系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Linux部署MySQL

Linux部署MySQL5.7.17 mkdir /opt/mysql cd /opt/mysql#mysql下载官网&#xff1a; #https://downloads.mysql.com/archives/community/ #下载server、client、lib和common wget https://downloads.mysql.com/archives/get/p/23/file/mysql-community-server-5.7.17-1.el7.…

JavaScript高级(十七)---异步函数await-async

异步函数 async function 异步函数的内部代码执行过程和普通的函数是一致的&#xff0c;默认情况下也是会被同步执行。 async function foo() {console.log("foo function start~")console.log("内部的代码执行1")console.log("内部的代码执行2&quo…

ISIS骨干网连续性简述

默认情况下&#xff0c; 一、L1路由器是ISIS 普通区域内部路由器&#xff0c;只能与L1和L1-2路由器建立邻接关系&#xff0c;不能与L2路由器建立邻接关系。 二、L2路由器是骨干区域的路由器&#xff0c;L2路由器只能与其他 L2路由器同处一个区域&#xff0c;可与本区域的L2路由…

数值分析(三) Lagrange(拉格朗日)插值法及Matlab代码实现

目录 前言一、Lagrange&#xff08;拉格朗日&#xff09;插值1. 线性插值2. 抛物插值3. 拉格朗日插值多项式 二、Lagrange插值算法及matlab代码1. Lagrange 插值算法matlab实现2 实例3. 线性插值示意图代码4. 抛物插值示意图代码 三、总结四、插值法专栏 前言 本篇为插值法专栏…

生产计划数据模型,实现能源企业数字化高效管理

随着市场经济的快速发展&#xff0c;能源企业在经济发展中的地位也随之提高。但由于能源企业在生产计划经济管理上存在指标不平衡、市场观念落后和环保意识欠缺等问题&#xff0c;导致企业的经济效益降低。目前&#xff0c;提高企业的生产计划管理是改善能源企业现状最有利的途…

【合合TextIn】深度解析智能文档处理技术与应用

目录 一、智能文档处理介绍 二、文档格式解析 三、图像增强技术解析 四、传统文字识别OCR技术解析 五、深度学习OCR技术解析 六、深度学习版面分析技术解析 七、文档分类 八、信息抽取 九、系统集成&#xff1a;将IDP处理后的数据集成到企业系统 结论 一、智能文档处…