std::to_string是c++11引入的字符串转换函数,需#include ,支持数值类型转字符串,但不支持char、bool(隐式转int)、自定义类型及格式控制。

to_string 是 C++11 起的标准函数,直接可用
只要编译器支持 C++11 或更高(基本所有现代编译器默认开启),std::to_string 就能直接用,无需额外头文件——它定义在 <string></string> 中,记得 #include <string></string>。
它支持 int、long、long long、unsigned 系列、float、double、long double。对 int 最常用:
int x = 42; std::string s = std::to_string(x); // s == "42"
注意:没有重载接受 char 或 bool(bool 会隐式转成 int,结果是 "0" 或 "1");也不支持自定义类型。
to_string 处理负数和零没问题,但不控制格式
std::to_string 按十进制、无前导零、无符号位(负数带 '-')、无科学计数法输出。例如:
立即学习“C++免费学习笔记(深入)”;
-
std::to_string(-123)→"-123" -
std::to_string(0)→"0" -
std::to_string(007)→"7"(因为007是八进制字面量,但值仍是7)
它**不提供**宽度填充、进制切换(如十六进制)、小数位数控制等功能。需要这些?得换方案:
- 要补零:用
std::ostringstream+std::setfill/std::setw - 要十六进制:用
std::stringstream+std::hex - 要固定小数位:对浮点数,
std::to_string精度不可控,建议用std::format(C++20)或sprintf风格
常见错误:忘记命名空间或拼错函数名
最常踩的坑是写成 to_string(x)(没加 std::)而没开 using std::to_string,导致编译报错:error: 'to_string' was not declared in this scope。
另一个低级错误是拼成 toString 或 to_stringi,C++ 标准里只有 std::to_string —— 全小写,下划线分隔,无 i 无 Int 后缀。
还有人试图传指针:std::to_string(&x),这会尝试把地址转成字符串(实际调用的是 long long 重载),结果是未定义行为或巨大随机数,绝对不要这么干。
替代方案:什么时候不该用 to_string
如果项目还停留在 C++98/C++03,std::to_string 不可用,得用 std::ostringstream:
int x = 42; std::ostringstream oss; oss << x; std::string s = oss.str();
如果频繁转换且性能敏感(比如循环内百万次),to_string 内部有内存分配,snprintf + std::string 构造可能更快(但可读性差):
int x = 42; char buf[12]; // int 通常不超过 11 位 + 符号 int len = snprintf(buf, sizeof(buf), "%d", x); std::string s(buf, len);
不过,除非 profiling 明确指出这是瓶颈,否则优先用 std::to_string —— 它语义清晰、类型安全、不易出错。
真正容易被忽略的是:std::to_string 对浮点数的输出精度由实现定义,不同标准库(libstdc++ / libc++ / MSVC)可能输出不同位数,比如 std::to_string(1.2) 可能是 "1.200000" 也可能是 "1.2"。需要确定格式,必须绕开它。











