std::to_string 是转换内置数值类型为字符串的首选方法,语义清晰、标准化且安全;需注意仅支持 int、double 等基本类型,不支持指针或自定义类型,也不支持进制控制与格式化。

用 std::to_string 是最直接安全的方式
只要编译器支持 C++11 或更高版本,std::to_string 就是首选。它专为基本数值类型设计,语义清晰、无内存管理负担,且对 int 的转换行为完全标准化。
常见错误是试图传入指针或自定义类型——std::to_string 只接受 int、long、double 等内置数值类型,不支持 int* 或用户类。
- 正确写法:
std::string s = std::to_string(42); - 负数也正常:
std::to_string(-7)得到"-7" - 注意:它不支持进制控制(比如转成十六进制),也不接受格式化参数
需要格式化(如补零、指定进制)时用 std::ostringstream
当你要把 int 转成带前导零的字符串(如 5 → "005"),或转成十六进制、八进制,std::to_string 就不够用了。这时 std::ostringstream 更灵活,行为和 printf 类似但类型安全。
容易踩的坑是忘记包含头文件或漏掉 <font color="red">std::setw</font> 和 std::setfill 的组合使用——单独设宽度没效果。
- 补零示例:
std::ostringstream oss; oss
- 十六进制:
oss → <code>"ff"(加std::uppercase可得"FF") - 性能上比
std::to_string略低,但日常使用差异可忽略
旧代码里看到 itoa?别用
itoa 不是标准 C++ 函数,是某些 C 库(如 MSVC CRT)的扩展,GCC/Clang 默认不提供。即使能编译,它依赖手动管理缓冲区,容易导致栈溢出或截断。
典型错误写法:char buf[10]; itoa(123, buf, 10); ——如果值超过 9 位(如 INT_MIN),buf 就不够存。
- 替代方案:用
std::to_string(推荐)或std::sprintf+std::string(需确保缓冲区足够大) - 若必须用 C 风格,至少用
snprintf:char buf[12]; snprintf(buf, sizeof(buf), "%d", n);
频繁转换时要注意临时对象开销
每次调用 std::to_string 或构造 std::ostringstream 都会创建新 std::string 对象。在 tight loop 里反复转换同一组整数(比如日志循环中打序号),可能成为瓶颈。
这不是“不能用”,而是提醒你:如果 profiling 确实发现这里耗时高,才值得优化;否则优先选清晰安全的写法。
- 可复用
std::ostringstream对象(调用oss.str("")清空,而非重建) -
std::to_string无法复用,但现代 STL 实现通常有 small-string 优化,短数字(如个位数)不触发堆分配 - 极端场景(如嵌入式)才考虑查表法或手工写十进制转换逻辑
int→string 场景用 std::to_string 就够了;剩下那 5%,多数是因为忘了它不支持格式化,而不是它真不行。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











