size()和length()的区别
size()
是 C++ STL 容器的标准方法,用于返回容器中元素的数量。(更现代、更推荐)length()
是std::string
类为了与旧代码和直观性保持一致性而提供的成员函数,其作用与string::size()
完全相同。- 对于 C 风格的字符串(字符数组),你需要使用
strlen()
函数。
下面是详细的解释和对比:
核心区别总结表
特性 | size() | length() |
---|---|---|
来源 | 所有 STL 容器(如 vector , list , map , string ) | 仅存在于 std::string 类 |
目的 | 返回容器中的元素个数(通用概念) | 返回字符串的长度(字符个数)(特定概念) |
返回值 | size_type (通常是无符号整型,如 std::size_t ) | 与 size() 完全一样 |
推荐度 | 更推荐,因为它是所有容器统一的接口 | 也可以使用,但在非字符串上下文中不可用 |
详细说明和代码示例
1. 在 std::string
上
对于 std::string
,size()
和 length()
是完全等价的,可以互换使用。它们都返回字符串中的字符数(不包括末尾的 '\0'
)。
为什么 string
要有两个功能一样的函数?
主要是历史原因和为了直观性:
length()
: 对于字符串来说,“长度”是一个非常自然和直观的概念,所以为了代码的可读性提供了这个函数。size()
: 为了让std::string
的行为与 STL 中的其他容器(如vector
,list
)保持一致,因为所有容器都有size()
方法。
#include <iostream>
#include <string>int main() {std::string str = "Hello, World!";std::cout << "str.size(): " << str.size() << std::endl; // 输出 13std::cout << "str.length(): " << str.length() << std::endl; // 输出 13// 它们永远是相等的if (str.size() == str.length()) {std::cout << "size() and length() are always equal for strings." << std::endl;}return 0;
}
建议: 在 std::string
的上下文中,两者都可以。但为了保持代码风格的一致性(尤其是在模板编程中),更推荐使用 size()
,因为这样你的代码对于其他容器也是通用的。
2. 在其他 STL 容器上
这是关键区别:其他 STL 容器(如 vector
, list
, deque
, set
, map
等)只有 size()
方法,而没有 length()
方法。
#include <iostream>
#include <vector>
#include <list>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::list<std::string> myList = {"a", "bb", "ccc"};std::cout << "vec.size(): " << vec.size() << std::endl; // 输出 5// std::cout << vec.length(); // 错误:std::vector 没有 length() 成员函数std::cout << "myList.size(): " << myList.size() << std::endl; // 输出 3return 0;
}
3. 对于 C 风格字符串(字符数组)
对于 C 风格的字符串(例如 char myStr[] = "hello";
),你不能使用 size()
或 length()
,因为它们不是类对象,没有成员函数。你必须使用 C 标准库函数 strlen()
,它在 <cstring>
头文件中定义。
#include <iostream>
#include <cstring> // 用于 strlen()int main() {const char* c_str = "Hello, C-style!";// std::cout << c_str.size(); // 错误// std::cout << c_str.length(); // 错误std::cout << "strlen(c_str): " << std::strlen(c_str) << std::endl; // 输出 15// strlen 计算的是直到遇到 '\0' 之前的字符个数return 0;
}
结论与最佳实践
- 统一使用
size()
: 为了代码的一致性和通用性,尤其是在编写模板代码时(模板函数或类需要处理各种容器类型),始终使用size()
。这是最安全、最现代的风格。 length()
仅用于std::string
: 如果你在非模板代码中处理字符串,并且觉得length()
让意图更清晰,使用它也没有问题。但要记住它只在string
类中存在。- C 风格字符串用
strlen()
: 处理老式的char*
或char[]
时,使用strlen()
。
简单记住:当你想获取元素个数时,对于所有 STL 容器(包括 string
),都用 size()
就对了。