应使用 empty() 判断 std::string 是否为空,因其语义清晰、安全高效;c_str() 永不返回 nullptr,故不能用于空判断;empty() 与 size() == 0 性能无实质差异,但前者明确表达逻辑意图。

std::string 是否为空,直接用 empty() 成员函数判断,这是最安全、最高效的方式。别用 length() == 0 或 size() == 0 替代——虽然结果一样,但语义不清,且在某些极端优化场景下可能多一次计算(尽管现代编译器通常会优化掉)。
为什么不能用 c_str() == nullptr 判断空字符串?
std::string 的 c_str() 永远不会返回 nullptr,即使字符串为空,它也返回指向内部空终止字符的合法指针。拿 c_str() 跟 nullptr 比较,逻辑上就错了,而且编译器可能报 comparison between pointer and integer 警告。
- 错误写法:
if (s.c_str() == nullptr) - 正确写法:
if (s.empty()) - 空字符串的
c_str()指向一个有效的'\0'字节,不是空指针
empty() 和 size() == 0 在性能上有区别吗?
没有实际区别——empty() 通常被实现为 size() == 0 的内联包装,但标准明确要求 empty() 是常数时间、无副作用、不抛异常。关键在于意图表达:
-
s.empty()明确表达“我关心的是‘是否为空’这个逻辑状态” -
s.size() == 0暗示你在做数值比较,可能误导后续维护者(比如误以为要扩展成size() ) - 所有主流 STL 实现(libstdc++、libc++、MSVC STL)中,
empty()都是直接读取长度字段或检查内部指针是否为 null(小字符串优化下也可能不同),比size()更轻量(size()有时需计算)
初始化后未赋值的 string 是否自动为空?
是的,只要按标准方式定义,std::string 构造即为空:
立即学习“C++免费学习笔记(深入)”;
-
std::string s;→s.empty() == true -
std::string s{};→ 同上,值初始化 -
std::string s = "";→ 显式空字符串,empty()仍为true - 但注意:如果用 C 风格指针构造,如
std::string s(nullptr);—— 这是未定义行为,不要这么写
容易被忽略的一点:自定义分配器或使用 std::string_view 时,empty() 行为一致,但 string_view 的 empty() 不涉及内存管理,而 std::string::empty() 始终只看当前逻辑长度,跟容量(capacity())无关。











