当前位置: 首页 > news >正文

C++ 流式处理字符串

在 C++ 中,如果需要拼接一个长文档(比如 HTML、XML、JSON 或纯文本),使用 std::ostringstream(流式拼接)比直接使用 +=+ 更高效、更清晰。以下是几种不同的实现方式:


1. 使用 std::ostringstream(推荐)​

#include <iostream>
#include <sstream>
#include <string>int main() {std::ostringstream oss;// 逐行拼接长文档oss << "<!DOCTYPE html>\n";oss << "<html lang=\"zh-CN\">\n";oss << "<head>\n";oss << "    <meta charset=\"UTF-8\">\n";oss << "    <title>示例文档</title>\n";oss << "</head>\n";oss << "<body>\n";oss << "    <h1>欢迎使用 C++ 字符串拼接</h1>\n";oss << "    <p>这是使用 std::ostringstream 拼接的长文档示例。</p>\n";oss << "    <p>当前时间: " << __DATE__ << " " << __TIME__ << "</p>\n";oss << "</body>\n";oss << "</html>\n";// 获取最终字符串std::string document = oss.str();// 输出到控制台std::cout << document << std::endl;return 0;
}
优点
  • 高效​:std::ostringstream 内部优化了内存分配,适合大量拼接。
  • 类型安全​:自动处理不同类型的数据(如 intfloatstd::string)。
  • 可读性好​:类似 std::cout 的语法,易于维护。

2. 使用 C++11 原始字符串字面量(Raw String Literals)​

如果文档内容固定,可以使用 ​原始字符串​(R"(...)")避免转义字符:

#include <iostream>
#include <string>int main() {std::string document = R"(
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>示例文档</title>
</head>
<body><h1>欢迎使用 C++ 字符串拼接</h1><p>这是使用原始字符串 (Raw String Literal) 的示例。</p>
</body>
</html>
)";std::cout << document << std::endl;return 0;
}
适用场景
  • 文档内容固定,不需要动态拼接变量。
  • 避免手动处理换行符和转义字符(如 \")。

3. 使用 std::format(C++20 或更高版本)​

如果编译器支持 C++20,可以使用 std::format 进行更灵活的拼接:

#include <iostream>
#include <format>
#include <string>int main() {std::string title = "示例文档";std::string currentTime = __DATE__;std::string document = std::format(R"(
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>{}</title>
</head>
<body><h1>欢迎使用 C++ 字符串拼接</h1><p>当前时间: {}</p>
</body>
</html>
)", title, currentTime);std::cout << document << std::endl;return 0;
}
优点
  • 类似 Python 的 f-string,变量直接嵌入字符串。
  • printf 更安全,比 std::ostringstream 更简洁。

4. 传统 += 拼接(不推荐)​

虽然可以工作,但性能较差,代码可读性低:

#include <iostream>
#include <string>int main() {std::string document;document += "<!DOCTYPE html>\n";document += "<html lang=\"zh-CN\">\n";document += "<head>\n";document += "    <meta charset=\"UTF-8\">\n";document += "    <title>示例文档</title>\n";document += "</head>\n";document += "<body>\n";document += "    <h1>欢迎使用 C++ 字符串拼接</h1>\n";document += "    <p>这是使用 += 拼接的示例。</p>\n";document += "</body>\n";document += "</html>\n";std::cout << document << std::endl;return 0;
}
缺点
  • 性能差​:每次 += 可能导致内存重新分配。
  • 可读性差​:需要手动管理换行和缩进。

总结

方法适用场景优点缺点
std::ostringstream动态拼接长文档高效、类型安全、可读性好代码稍长
原始字符串 R"(...)"固定内容文档无需转义、简洁不能动态插入变量
std::format (C++20)现代 C++ 项目类似 Python f-string,简洁需要 C++20 支持
+= 拼接简单场景直接性能差、可读性低

推荐做法​:

  • 动态内容​ → std::ostringstreamstd::format(C++20)
  • 静态内容​ → 原始字符串 R"(...)"
  • 避免​ → 大量使用 += 拼接

https://github.com/0voice

http://www.dtcms.com/a/326439.html

相关文章:

  • C语言变量的声明和定义有什么区别?
  • UE 手柄点击UI 事件
  • 长难句lesson1
  • PPIO上线智谱GLM-4.5V
  • 【stm32】EXTI外部中断
  • QT聊天项目DAY18
  • Prompt Engineering 最佳实践:让AI输出更精准的核心技巧
  • HIS系统:医院信息化建设的核心,采用Angular+Java技术栈,集成MySQL、Redis等技术,实现医院全业务流程管理。
  • LS1043A+AQR115C万兆网口调试
  • 机器学习第九课之DBSCAN算法
  • 下一代防火墙组网全解析
  • Linux下安装jdk
  • 从零构建企业级K8S:高可用集群部署指南
  • 简单了解MongoDB数据存储
  • 计算机网络---交换机
  • Excel导入mysql,带小数点如何解决?
  • 物联网通讯协议-MQTT、Modbus、OPC
  • 支持向量机SM
  • 人工智能-python-机器学习-线性回归与梯度下降:理论与实践
  • 大屏幕自适应
  • 基于FPGA的热电偶测温数据采集系统,替代NI的产品(三)测试
  • C++ STL | STL迭代器(lterator)
  • 阿里千问系列:Qwen3 强化学习新算法GSPO!
  • HTML应用指南:利用GET请求获取全国一加授权零售店位置信息
  • 机器学习逻辑回归实战
  • 【Lua】题目小练10
  • computed使用的方式
  • 【Lua】XLua加载lua文件
  • xlsxio全平台(x86、arm32、arm64 )编译、测试,使用编译脚本10分钟快速编译!
  • redis常见的性能问题