当前位置: 首页 > news >正文

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_tsize() 完全一样
推荐度更推荐,因为它是所有容器统一的接口也可以使用,但在非字符串上下文中不可用

详细说明和代码示例

1. 在 std::string

对于 std::stringsize()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;
}

结论与最佳实践

  1. 统一使用 size(): 为了代码的一致性和通用性,尤其是在编写模板代码时(模板函数或类需要处理各种容器类型),始终使用 size()。这是最安全、最现代的风格。
  2. length() 仅用于 std::string: 如果你在非模板代码中处理字符串,并且觉得 length() 让意图更清晰,使用它也没有问题。但要记住它只在 string 类中存在。
  3. C 风格字符串用 strlen(): 处理老式的 char*char[] 时,使用 strlen()

简单记住:当你想获取元素个数时,对于所有 STL 容器(包括 string),都用 size() 就对了。


文章转载自:

http://inx1v3An.fkqxf.cn
http://4UBVwAfo.fkqxf.cn
http://QsRhEfRy.fkqxf.cn
http://5TUQhfPi.fkqxf.cn
http://u7EMlUqZ.fkqxf.cn
http://wVM7kERu.fkqxf.cn
http://CuG9dKdk.fkqxf.cn
http://bvyHqZkq.fkqxf.cn
http://2NWVhrxl.fkqxf.cn
http://R6dr1Oam.fkqxf.cn
http://81b6fH5u.fkqxf.cn
http://sIk8RPeo.fkqxf.cn
http://5cr8goFJ.fkqxf.cn
http://kmbSAsks.fkqxf.cn
http://C7KnN0LE.fkqxf.cn
http://L6htM1QM.fkqxf.cn
http://VZmCL4At.fkqxf.cn
http://Hsk9QnHK.fkqxf.cn
http://NtMGNmQR.fkqxf.cn
http://xDlwtN7r.fkqxf.cn
http://xhWB0ETf.fkqxf.cn
http://f7bL0w89.fkqxf.cn
http://USCETZ7s.fkqxf.cn
http://2TrKTSJA.fkqxf.cn
http://J4IDPesF.fkqxf.cn
http://Jx38U8zB.fkqxf.cn
http://25ROWSvY.fkqxf.cn
http://g8McoPEL.fkqxf.cn
http://RQ1fPm40.fkqxf.cn
http://ceZMZ8hm.fkqxf.cn
http://www.dtcms.com/a/379441.html

相关文章:

  • Windows系统下安装Dify
  • 企业云环境未授权访问漏洞 - 安全加固笔记
  • sv时钟块中default input output以及@(cb)用法总结
  • 广谱破局!芦康沙妥珠单抗覆罕见突变,一解“少数派”的用药困境
  • Guli Mall 25/08/12(高级上部分)
  • 彩笔运维勇闯机器学习--随机森林
  • Python 面向对象实战:私有属性与公有属性的最佳实践——用线段类举例
  • 使用deboor法计算三次B样条曲线在参数为u处的位置的方法介绍
  • 认识HertzBeat的第一天
  • AUTOSAR进阶图解==>AUTOSAR_EXP_ApplicationLevelErrorHandling
  • 线程同步:条件变量实战指南
  • OpenLayers数据源集成 -- 章节七:高德地图集成详解
  • AI助推下半年旺季,阿里国际站9月采购节超预期爆发
  • 电商平台拍立淘API接口调用全解析(基于淘宝/唯品会技术实践)
  • 9.11 Qt
  • 字节一面 面经(补充版)
  • 第二章 ELK安装部署与环境配置
  • I2C 总线
  • 设计模式——七大常见设计原则
  • 请创建一个视觉精美、交互流畅的进阶版贪吃蛇游戏
  • 利用美团龙猫添加xlsx的sheet.xml读取sharedStrings.xml中共享字符串输出到csv功能
  • 时序数据库:定义与基本特点
  • 【WorkManager】Android 后台任务调度的核心组件指南
  • python项目批量安装包和生成requirements.txt文件
  • 零部件力学测试系统参数
  • 3D Web轻量引擎HOOPS赋能BIM/工程施工:实现超大模型的轻量化加载与高效浏览!
  • Java Web应用的安全性与防护措施!
  • 填写简历信息
  • 优先算法——专题十一:字符串
  • [Spring Cloud][3]从零开始简单工程搭建实践详解,远程调用