stringstream的使用

std::stringstream 是C++标准库中的一个类,用于在内存中操作字符串流。它提供了一种方便的方式来格式化和解析字符串数据,类似于文件流(如 std::ifstreamstd::ofstream)但针对字符串。std::stringstream 属于 <sstream> 头文件,结合了输入(std::istringstream)和输出(std::ostringstream)的功能。

1.基本功能
  • 格式化输出:可以像使用 std::cout 一样向 std::stringstream 写入数据,然后将其作为字符串读取。
  • 字符串解析:可以将一个字符串传递给 std::stringstream,并从中解析不同的数据类型。
  • 内存中的流操作:不涉及文件操作,完全在内存中进行数据的格式化和解析。
2.常见用法

构造和赋值

#include <sstream>
#include <string>int main() {// 创建一个空的 stringstreamstd::stringstream ss;// 用字符串初始化 stringstreamstd::string initialData = "123 456";std::stringstream ss2(initialData);
}

写入数据

#include <sstream>
#include <iostream>int main() {std::stringstream ss;int num = 42;std::string text = "Hello, World!";// 向 stringstream 写入数据ss << num << " " << text;// 获取生成的字符串std::string result = ss.str();std::cout << "Generated string: " << result << std::endl;return 0;
}

读取数据

#include <sstream>
#include <iostream>int main() {std::string data = "123 456.789 Hello";std::stringstream ss(data);int i;float f;std::string s;// 从 stringstream 读取数据ss >> i >> f >> s;std::cout << "Integer: " << i << std::endl;std::cout << "Float: " << f << std::endl;std::cout << "String: " << s << std::endl;return 0;
}

清空和重用

#include <sstream>
#include <iostream>int main() {std::stringstream ss;ss << "Initial text";std::cout << "Before clearing: " << ss.str() << std::endl;// 清空内容并重用ss.str("");ss.clear();ss << "New text";std::cout << "After clearing: " << ss.str() << std::endl;return 0;
}
3.常见的操作
  • str():获取或设置 stringstream 中的字符串。
  • clear():重置流的状态标志。
  • seekg()seekp():调整流中读写指针的位置。
#include <sstream>
#include <iostream>int main() {std::stringstream ss("1234");// 读取第一个字符char c;ss >> c;std::cout << "First char: " << c << std::endl; // 1// 移动读指针到起始位置ss.seekg(3);// 读取第一个字符ss >> c;std::cout << "First char after seekg: " << c << std::endl; // 4return 0;
}
4.适用场景
  • 字符串拼接和格式化:代替 sprintf 或手动字符串拼接操作,更加类型安全。
  • 解析复杂字符串:从一个字符串中提取并解析多个数据字段。
  • 内存中的流处理:无需文件I/O操作,适合处理小型数据或临时数据。
5.示例:解析复杂字符串
#include <sstream>
#include <iostream>int main() {std::string data = "42 3.14 Hello World";std::stringstream ss(data);int integer;float real;std::string firstWord, secondWord;ss >> integer >> real >> firstWord >> secondWord;std::cout << "Integer: " << integer << std::endl;std::cout << "Float: " << real << std::endl;std::cout << "First word: " << firstWord << std::endl;std::cout << "Second word: " << secondWord << std::endl;return 0;
}
7. 线程安全

std::stringstream 不是线程安全的。如果多个线程同时访问同一个 std::stringstream 对象,必须使用适当的同步机制(如互斥锁)来防止数据竞争和不一致。

8. 相关类
  • std::istringstream:只支持输入操作的字符串流。
  • std::ostringstream:只支持输出操作的字符串流。
  • std::fstreamstd::ifstreamstd::ofstream:文件流,用于处理文件的I/O操作。
总结

std::stringstream 是一个强大的工具,用于在内存中处理字符串数据。它提供了灵活的格式化和解析功能,适合在需要频繁进行字符串操作的应用场景中使用。相比传统的C风格字符串操作,std::stringstream 提供了更安全和更便捷的接口,有助于提高代码的可读性和维护性。

具体例题例子
string discountPrices(string sentence, int discount) {double d = 1 - discount / 100.0;stringstream ss(sentence);string ans, w;while (ss >> w) { // 一边分割,一边加到答案中if (!ans.empty()) {ans += ' ';}if (w.length() > 1 && w[0] == '$' && all_of(w.begin() + 1, w.end(), ::isdigit)) {stringstream s;s << fixed << setprecision(2) << '$' << stoll(w.substr(1)) * d;ans += s.str();} else {ans += w;}}return ans;
}

解释:

std::fixed:

  • 操作流,使其以定点表示法输出浮点数。
  • 输出的浮点数总是保留固定的小数位数(由 std::setprecision 指定)。
  • 如果 std::setprecision 设置了整数部分小数点后的位数,将用0填充不足的位数。

std::setprecision:

  • 用于设置浮点数输出时的小数精度。
  • 其效果取决于当前流的浮点格式模式(例如,std::fixedstd::scientific)。
  • std::fixed 模式下,std::setprecision 控制小数点后的位数。
举例

显示两位小数

#include <iostream>
#include <iomanip>int main() {double pi = 3.141592653589793;std::cout << std::fixed << std::setprecision(2) << pi << std::endl; // Output: 3.14return 0;
}
与其他格式操纵符对比
  • std::scientific
    • 将浮点数以科学计数法输出。
    • 通常用于处理非常大或非常小的数值。
#include <iostream>
#include <iomanip>int main() {double value = 12345.6789;std::cout << std::scientific << std::setprecision(2) << value << std::endl; // Output: 1.23e+04return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于协同过滤算法的电影推荐

基于协同过滤算法的电影推荐 电影推荐系统使用了基于**协同过滤&#xff08;Collaborative Filtering&#xff09;的算法来生成推荐。具体来说&#xff0c;使用了基于用户的协同过滤&#xff08;User-Based Collaborative Filtering&#xff09;**算法&#xff0c;步骤如下&am…

Selenium等待方式详解:原理、用法与应用场景

在自动化测试中&#xff0c;等待是一个非常重要的概念。正确地使用等待可以提高测试用例的可靠性和稳定性。本文将详细介绍Selenium中的三种等待方式&#xff1a;线程阻塞等待、隐式等待和显式等待&#xff0c;分析它们的原理、用法和应用场景。 1. 线程阻塞等待 线程阻塞等待…

XLM-RoBERTa 是一种多语言版本的 RoBERTa 模型

XLM-RoBERTa 是一种多语言版本的 RoBERTa 模型&#xff0c;由 Facebook AI 开发。它是为了处理多种语言的自然语言理解任务而设计的。 XLM-RoBERTa 的主要特性&#xff1a; 多语言能力&#xff1a;在使用 CommonCrawl 数据集的 100 种语言上进行训练&#xff0c;XLM-RoBERTa …

【SCAU数据挖掘】数据挖掘期末总复习题库应用题及解析

1. 给定圆的半径为e &#xff0c;令 MinPts3&#xff0c;考虑下面两幅图。 &#xff08;1&#xff09;哪些对象是核心对象? m,p,o,r(因为这些核心对象在半径e的范围内都至少包含MinPts3个对象) &#xff08;2&#xff09;哪些对象是直接密度可达的? 对象q是…

Thermo Fisher赛默飞TSQ单杆电源维修1R120380-0001

美国热电质朴分析仪电路板维修&#xff0c;液相色谱质谱联用仪维修&#xff0c;Thermo Fisher赛默飞世尔光谱仪IS10 IS5赛默飞主板维修。 公司仪器维修设备备有三相交流电源,变频电源&#xff0c;无油空压气源&#xff0c;标准化的维修平台、电子负载&#xff0c;耐压测试仪、老…

MongoDB和AI 赋能行业应用:零售

欢迎阅读“MongoDB 和 AI 赋能行业应用”系列的第三篇。 本系列重点介绍 AI 应用于不同行业的关键用例&#xff0c;涵盖制造业和汽车行业、金融服务、零售、电信和媒体、保险以及医疗保健行业。 利用生成式 AI 技术&#xff08;Gen AI&#xff09;&#xff0c;零售商可以创造…

软考中级哪个科目比较简单,只为拿证?

中级科目包括信息系统、计算机网络等5个方向&#xff0c;共计15门课程。软考中级难度适中&#xff0c;考取后即可获得中级职称&#xff0c;因此性价比最高。 需要留意的是&#xff0c;这些科目中&#xff0c;有一些是每年只有一次考试的&#xff0c;有一些是每年有两次考试的&a…

java遇到问题 不行就 重启项目 清理缓存 在别人电脑试试

java遇到问题 不行就 重启项目 清理缓存 在别人电脑试试 java遇到问题 不行就 重启项目 清理缓存 在别人电脑试试

【机器学习】第2章 线性回归及最大熵模型

一、概念 1.回归就是用一条曲线对数据点进行拟合&#xff0c;该曲线称为最佳拟合曲线&#xff0c;这个拟合过程称为回归。 2.一个自变量 叫 一元线性回归&#xff0c;大于一个自变量 叫 多元线性回归。 &#xff08;1&#xff09;多元回归&#xff1a;两个x&#xff0c;一个…

qmt量化交易策略小白学习笔记第37期【qmt编程之指数数据--如何获取迅投商品市场指数行情数据】

qmt编程之获取商品市场指数数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取迅投商…

HPMicro:FEMC应用指南

先楫FEMC的基本概念介绍 FEMC (Flexible External Memory Controller)全称为多功能外部存储器控制器。作为并行接口控制器&#xff0c;FEMC具有访问存储数据速度快的特点。 HPM的FEMC只有一路&#xff0c;由于FEMC是并口&#xff0c;所以占用的管脚较多。而且HPM的FEMC信号引脚…

spring ioc和aop底层是使用什么实现的

Spring IOC底层实现 Spring IOC容器是Spring框架的核心&#xff0c;它负责创建和管理应用程序中的对象&#xff08;Bean&#xff09;。IOC容器底层实现主要依赖于以下几个关键组件和概念&#xff1a; 1、BeanFactory&#xff1a;这是Spring IOC容器的最底层接口&#xff0c;提…

【JS重点19】this指向问题总结

阅读本文章目标&#xff1a;够知道this在不同环境下的默认值&#xff0c;知道动态指定函数this值的方法 一&#xff1a;普通函数this指向 普通函数的调用方式决定了this的值&#xff0c;即谁调用普通函数&#xff0c;this就指向谁 setTimeout(function () {console.log(this)…

【面试干货】ArrayList、Vector、LinkedList的存储性能和特性比较

【面试干货】ArrayList、Vector、LinkedList的存储性能和特性比较 1、ArrayList1.1 存储性能1.2 特性1.3 示例用法 2、Vector2.1 存储性能2.2 特性2.3 示例用法 3、LinkedList3.1 存储性能3.2 特性3.3 示例用法 4、ArrayList、Vector、LinkedList用法总结 &#x1f496;The Beg…

Transformer革新:Infini-Transformer在长文本处理中的突破

在当今信息爆炸的时代&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在处理长文本数据方面的需求日益增长。无论是科学研究、法律分析还是医学诊断&#xff0c;长文本的处理能力都显得尤为重要。然而&#xff0c;现有的基于Transformer的模型在处理这类数据时遇到了重大…

PHP框架详解 - CakePHP框架

CakePHP 是一个开源的 PHP Web 应用框架&#xff0c;它遵循 MVC&#xff08;模型-视图-控制器&#xff09;设计模式。CakePHP 提供了快速开发的功能&#xff0c;如代码自动生成、数据库交互的 CRUD 操作支持、灵活的路由、模板引擎、表单处理以及其它许多有用的特性22。 CakeP…

硬件电路基础【5.二极管】

二极管 前言一、基本原理1.1 介绍1.2 结构组成1.3 符号1.4 正负极判断 二、特性参数开关电路注意的参数极限特性电气特性特性曲线 三、应用场景稳压二极管原理故障特点连接方式参数最大额定参数电气特性特性曲线 应用典型的串联型稳压电路过压保护稳压二极管的应用与选择 肖特基…

关于一份nginx-我是如何优化的

需求场景 1、需要负载均衡指定几个服务&#xff0c;如果有服务出现预期错误&#xff0c;就会更换另外一个服务接口 2、合理优化一些细节日志输入和性能 Nginx 配置文件&#xff08;带注释&#xff09; #user nobody; # 以nobody用户运行Nginx进程 worker_processes 4; # 设…

CP AUTOSAR标准之FlashDriver(AUTOSAR_CP_SWS_FlashDriver)(更新中……)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块[1]Flash驱动程序的功能、API和配置。   此规范适用于内部和外部闪存的驱动程序。   闪存驱动程序提供读取、写入和擦除闪存的服务以及用于设置/重置写入/擦除保护的配置接口(如果底层硬件支持)。   在ECU的应用模式下,…

需要用来做3D家具展示的软件哪个网站更专业?

国内外的3D家具展示软件网站并且值得推荐的也就那么几家&#xff1a; 1、Cedreo&#xff0c;Cedreo 是一个在线3D家居设计平台&#xff0c;适合专业的房屋建筑商、改造商和室内设计师。它允许用户创建2D和3D平面图以及室内外效果图&#xff0c;拥有7000多件可定制的3D家具、材…