【问题标题】:std::string length() and size() member functionsstd::string length() 和 size() 成员函数
【发布时间】:2010-10-28 16:12:31
【问题描述】:

我正在阅读这个question 的答案,发现实际上有一个名为length() 的方法用于std::string(我一直使用size())。在std::string 类中使用此方法有什么具体原因吗?我阅读了 MSDN 和 CppRefernce,它们似乎表明 size()length() 之间没有区别。如果是这样,是不是让班级的用户更加困惑?

【问题讨论】:

    标签: c++ string stl size


    【解决方案1】:

    根据documentation,这些只是同义词。 size() 是为了与其他 STL 容器(如 vectormap)保持一致,length() 是为了与大多数人对字符串的直观概念保持一致。人们通常谈论一个单词、句子或段落的长度,而不是它的大小,所以length() 是为了让事情更具可读性。

    【讨论】:

    • 同意。当我编写模板类和函数时,我宁愿使用size()(以防我使用非字符串类),但大多数时候我在使用纯字符串时使用length()
    • 不 size() 返回字符串在内存中的大小(以字节为单位),而 length() 返回字符数,这恰好是一致的,因为 1 char = 1 byte ?
    • 没有。它们是相同的功能;他们甚至共享文档:en.cppreference.com/w/cpp/string/basic_string/size.
    • 它们都被定义为等价于 distance(s.begin(), s.end()),其中 begin() 和 end() 是 CharT 元素的迭代器。 CharT 是一个模板参数,用于确定字符串中的内容。对于 std::string,CharT 是 char。对于 std::wstring,CharT 是 wchar_t,通常为 2 或 4 个字节。即使在那里,length() 和 size() 都会返回字符串中 characters 的数量,而不是字节数。
    • 你必须忘记有时人们会使用 std::string 来存储 UTF8 字符串。而utf8字符串是变长编码,那么就不能使用length()或者size()来获取字符串字符的个数。实际上他们只是返回元素的计数:std::string=> std::bacsic_string<char> count of charstd::wstring => std::basic_string<wchar_t> count of wchar_t.
    【解决方案2】:

    Ruby 也一样,顺便说一句,提供 #length #size 作为数组和散列中项目数的同义词(C++ 只对字符串这样做)。

    我想,极简主义者和相信“应该有一种,理想情况下只有一种明显的方式来做到这一点”(正如 Python 之禅所背诵的那样)的人大多会同意你的疑问,@Naveen,而粉丝Perl 的“有不止一种方法可以做到这一点”(或者 SQL 的语法带有大量可选的“干扰词”,给出了无数相同的语法形式来表达一个概念)无疑会抱怨 Ruby,尤其是 C++,只是不要'在提供这种同义词冗余方面做得不够;-)。

    【讨论】:

    • 在这种情况下是免费的。 Perl 的语法和用法让您可以使用您喜欢的任何风格来表达事物。同一件事有两个不同的词只会让在 Stackoverflow 中很难找到搜索词。
    【解决方案3】:

    在使用编码练习工具(LeetCode)时,似乎 size() 比 length() 快(虽然基本上可以忽略不计)

    【讨论】:

    【解决方案4】:

    字符串长度==该字符串有多少位, size==这些位的大小, 如果编辑器分配的字符大小为 1 字节,则在字符串中两者都是相同的

    【讨论】:

    • 错误答案。请参阅已接受答案中链接的文档。
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多