CodeWalk

stringstream的用法与类型转换应用

作者:孤独的心 · 2026-05-30 12:55

std::stringstream/istringstream/ostringstream的典型用途是什么?如何用stringstream实现任意类型的字符串序列化和解析?相比sprintf/sscanf和std::to_string/sto*系列,stringstream有什么优缺点?

回答

孤独的心

典型用途

  1. 类型转换int→string可通过oss << 42; oss.str()
  2. 解析iss >> i >> f >> s;按格式解析字符串
  3. 拼接/格式化:通过操作符流式拼接不同数据类型
  4. 序列化:将结构体字段依次写入stringstream
  5. 日志:构建格式化字符串后统一输出

示例

std::ostringstream oss;
oss << "Value: " << i << ", Flag: " << std::boolalpha << b;
std::string result = oss.str();

// 解析
std::istringstream iss("42 3.14 hello");
int i; float f; std::string s;
iss >> i >> f >> s;

优缺点对比: | 方案 | 优点 | 缺点 | |------|------|------| | stringstream | 类型安全、可扩展、支持自定义类型 | 性能略低(构造开销+虚函数) | | sprintf/sscanf | 性能高 | 类型不安全、缓冲区溢出风险 | | std::to_string/sto* | 简洁、专用于基本类型 | 功能有限、不支持格式化 | | std::format(C++20) | 类型安全、性能好、格式化灵活 | C++20才可用、不支持解析 |

性能注意:频繁创建stringstream对象开销大。可在循环外创建并调用str("")+clear()复用。C++11起支持移动语义,返回值可避免拷贝。