std::to_string是最直接安全的int转字符串方法,无需手动管理缓冲区,但不支持进制控制;需格式化时应使用std::stringstream。

用 std::to_string 最直接,别手写转换
直接把 int 变成字符串再拼接,std::to_string 是标准、安全、无依赖的解法。它底层调用 std::sprintf 类似逻辑,但不用管缓冲区、不担心溢出,也不依赖 C 风格字符串。
- 常见错误:用
std::string + int直接相加 → 编译报错:invalid operands to binary expression ('std::string' and 'int') - 正确姿势:先转再拼,比如
"value: " + std::to_string(42) - 注意:
std::to_string对负数、零、大整数都正常,但不支持进制控制(比如十六进制)——要十六进制得换std::stringstream或fmt::format - 性能上,它比
std::stringstream快,也比手动snprintf+std::string构造更简洁
需要格式化(如补零、进制、对齐)时用 std::stringstream
当不只是“转成十进制字符串”,还要控制输出样式,std::stringstream 更灵活。它模拟了流式 I/O 行为,可组合 std::hex、std::setfill 等操纵符。
- 常见错误:在
std::stringstream中漏掉str()调用,结果得到空字符串 —— 记住:ss 不返回字符串,<code>ss.str()才是最终结果 - 使用场景举例:
007这种三位补零、0xFF十六进制带前缀、右对齐宽度为 5 - 示例:
std::stringstream ss; ss << std::hex << std::uppercase << 255; std::string s = ss.str(); // 得到 "FF"
- 兼容性好,C++11 起全支持;但频繁构造/析构
std::stringstream对性能敏感场景需谨慎
高频拼接场景下避免临时对象堆积
如果在循环里反复拼接 int 到字符串(比如日志生成、CSV 构造),用 += 和预分配容量比多次 + 更省。
- 常见错误:写成
s = s + std::to_string(i)—— 每次都新建std::string,触发多次内存分配 - 更好做法:
s += std::to_string(i),前提是s已声明且可修改;若初始长度可预估,提前调用s.reserve(1024) - 极端情况(如百万次拼接),考虑用
fmt::format(编译期解析格式串)或absl::StrCat(零拷贝拼接),但需引入第三方库 -
std::to_string返回的是纯右值,无法避免一次移动构造,但比复制构造轻量得多
跨平台整型宽度不一致时,小心 long 和 long long
Windows 上 long 是 32 位,Linux/macOS 是 64 位;而 std::to_string 接收的参数类型必须精确匹配。传错会导致隐式截断或编译失败。
立即学习“C++免费学习笔记(深入)”;
- 常见错误:函数参数是
long,但在 64 位系统上调用std::to_string时误以为它能处理所有整型 —— 实际上std::to_string有重载,但只覆盖int、long、long long、unsigned等有限几种,不接受int64_t等 typedef 类型直接传入(可能触发二义性) - 稳妥做法:显式强转,比如
std::to_string(static_cast<long long>(x))</long>;或统一用int64_t配套std::to_string的long long版本 - 更推荐:用
std::to_string时坚持原始类型(int、long long),避免依赖 typedef;必要时用std::to_chars(C++17,无内存分配,但需自己管理 buffer)
std::to_string 就够了,剩下那 10% 多半是因为忘了它不支持格式化,或者没意识到 long 在不同平台上的位宽差异。










