stringstream的用法与类型转换应用
std::stringstream/istringstream/ostringstream的典型用途是什么?如何用stringstream实现任意类型的字符串序列化和解析?相比sprintf/sscanf和std::to_string/sto*系列,stringstream有什么优缺点?
回答
孤独的心
典型用途:
- 类型转换:
int→string可通过oss << 42; oss.str() - 解析:
iss >> i >> f >> s;按格式解析字符串 - 拼接/格式化:通过操作符流式拼接不同数据类型
- 序列化:将结构体字段依次写入stringstream
- 日志:构建格式化字符串后统一输出
示例:
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起支持移动语义,返回值可避免拷贝。