string::length()和string::size()完全等价,均返回size_t类型、O(1)时间复杂度的字符字节数,不计'\0';语义上length()侧重字符串长度,size()利于容器接口统一与泛型编程。

string::length() 和 string::size() 完全等价,选哪个都行
在 std::string 中,length() 和 size() 是两个同义函数,返回值类型都是 size_t,行为完全一致,底层调用同一段逻辑。C++ 标准明确要求二者必须等效。
实际使用中可按语义偏好选择:length() 更贴近“字符串有多少字符”的直觉;size() 则和容器接口统一(比如 vector::size()),利于代码风格一致性。
- 二者都不计算末尾的空字符
'\0'——std::string本身不以'\0'为结束标志,内部存储是独立管理的 - 调用开销是 O(1),因为长度信息已缓存在对象内,不是遍历计数
- 若字符串含 Unicode 多字节字符(如 UTF-8 编码的中文),它们返回的是字节数,不是“字符个数”(即不等价于 Unicode code point 数量)
c_str() + strlen() 是错误做法,除非你明确需要 C 风格兼容
有人会写 strlen(s.c_str()) 来获取长度,这不仅多余,还引入隐患:
-
c_str()返回的 C 字符串保证以'\0'结尾,但std::string可能包含中间的'\0'字节(合法),此时strlen()会提前截断,返回错误结果 - 多一次函数调用、多一次指针解引用,性能无优势
- 如果
s是空字符串或刚 move 构造而来,c_str()的有效性虽有保障,但毫无必要绕路
只有当你正在对接 C API(比如 printf("%s", s.c_str()))且恰好手头只有 strlen 可用时,才考虑它 —— 但获取长度这件事本身,仍应优先用 s.length()。
立即学习“C++免费学习笔记(深入)”;
size() 在模板泛型编程中更安全
如果你写的函数要同时支持 std::string、std::vector 或自定义容器,用 .size() 能直接适配大多数标准容器接口;而 .length() 仅存在于 std::string 和少数几个特化类型(如 std::array 没有 length())。
- 泛型函数中写
container.size()更通用,避免编译失败 -
std::string_view同样只提供size()和length()两个等价接口,但它的存在进一步强化了统一用size()的趋势 - 注意:
sizeof(s)是错的——它返回的是std::string对象自身内存大小(通常 24 或 32 字节),和内容长度无关
容易忽略的细节:size_t 的符号性与比较陷阱
length() 和 size() 返回 size_t(无符号整数),和有符号类型(如 int、ssize_t)混用时极易出错:
- 写
if (s.length() 会永远为 false —— 因为-1被提升为极大的正数(如18446744073709551615) - 循环中用
for (int i = s.length() - 1; i >= 0; --i)会导致无限循环:当i == 0时,再执行--i会变成极大正数 - 跨平台时注意:Windows 下
size_t是unsigned long,Linux x64 是unsigned long long,但对长度获取本身无影响
安全做法是:比较时统一用 size_t,或显式转成有符号类型(需先确认非负),循环倒序建议用 while (i-- > 0) 或从 0 正向遍历。











