std::string的length()和size()成员函数

346

我正在阅读这个问题的答案,发现实际上std::string有一个名为length()的方法(我总是使用size())。std::string类为什么要有这个方法?我阅读了MSDN和CppRefernce文档,它们似乎表明size()length()之间没有区别。如果真的如此,那么对于类的用户来说不是更加令人困惑了吗?

4个回答

469
根据文档,这些只是同义词。 size() 的存在是为了与其他STL容器保持一致(如vectormap等),而length()则是为了与大多数人对字符串的直观概念保持一致。人们通常谈论一个单词、句子或段落的长度,而不是大小,因此length()的存在使事情更易读。

13
同意。当我编写模板类和函数时,我更愿意使用 size()(以防我使用非字符串类),但在大多数情况下,我在处理普通字符串时使用 length() - Marius
8
size()返回字符串在内存中的大小(以字节为单位),而length()返回字符的数量,由于1个字符等于1个字节,因此它们恰好相同。 - Boyan Kushlev
8
不,它们有相同的功能;它们甚至共享文档:http://en.cppreference.com/w/cpp/string/basic_string/size。 - Todd Gamblin
7
它们都被定义为等同于 distance(s.begin(), s.end()),其中 begin() 和 end() 是 CharT 元素的迭代器。CharT 是一个模板参数,决定了字符串中包含的内容。对于 std::string,CharT 是 char。对于 std::wstring,CharT 是 wchar_t,通常为 2 或 4 个字节。即使如此,length() 和 size() 都将返回字符串中 字符 的数量,而不是字节数量。 - Todd Gamblin
12
有时候人们会使用std::string来存储UTF8字符串,而UTF8字符串是可变长编码的,所以你不能使用length()或size()来获取字符串字符的数量。实际上它们只返回元素的数量:std::string => std::basic_string<char> 字符数 std::wstring => std::basic_string<wchar_t> wchar_t数。 - Sheen Tian
显示剩余2条评论

20
顺便提一下,Ruby也提供了#length#size作为数组和哈希表中项目数量的同义词(而C++只对字符串这样做)。
简约主义者和那些相信“应该有一种,最好只有一种明显的方法来做到这一点”的人(正如Python之禅所述)将会大多同意@Naveen的疑虑,而Perl的粉丝们则会抱怨Ruby,尤其是C++在提供这种同义词冗余方面还不够远。SQL的语法有数不清的可选“噪音词”,给出无数个相同等效的句法形式来表达一个概念。

12
在这种情况下它是免费的。Perl 的语法和用法允许您使用任何喜欢的风格来表达事物。拥有两个不同的单词表示相同的东西只会使在 Stackoverflow 上搜索术语更加困难。 - Adrian Ratnapala

-7

当使用编程练习工具(LeetCode)时,size() 似乎比 length() 更快(尽管基本上可以忽略不计)


6
看起来对我来说相当类似!https://godbolt.org/z/xMao9f - Sam Mason

-20

字符串长度等于字符串包含的位数,大小等于这些位的大小,在字符串中,如果编辑器分配字符大小为1字节,则两者相同。


11
答案不正确。请参考已接受答案中链接的文档。 - Stefan de Kok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接