标准库中的String类 String(C++)【2】

文章目录

  • String常用的接口(黑框标记的是常用接口)
    • string类对象的反向遍历操作
      • 第一种
      • 第二种
    • 容量
      • string的扩容机制

String常用的接口(黑框标记的是常用接口)

string类对象的反向遍历操作

第一种

通过下表进行遍历

void TestString1()
{string s1("hello world");for (int i = s1.size(); i >= 0; i--){cout << s1[i] << " ";}cout << endl;
}

第二种

在这里插入图片描述

  • reverse_iterator:
    反向迭代器

在这里插入图片描述

  • rbegin:
    返回一个指向字符串最后一个字符的反向迭代器(即它的结尾)。

在这里插入图片描述

  • rend
    返回一个反向迭代器,指向字符串第一个字符前面的理论元素(该元素被认为是字符串的反向结束)。
void TestString2()
{string s1("hello world");string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){cout << *rit << " ";rit++;}cout << endl;
}

在这里插入图片描述

容量

在这里插入图片描述

  • szie:
    返回字符串的长度,以字节为单位。

在这里插入图片描述

  • lenth:
    返回字符串的长度,以字节为单位。
void TestString3()
{string s1("hello world");cout << s1.size() << endl;cout << s1.length() << endl;
}

在这里插入图片描述
没错你没有理解错,这两个接口作用完全一样,都是表示字符串中的字符数量。
至于原因:
主要是为了保持与C风格字符串处理函数的兼容性,因为在C语言中,字符串的长度是通过 strlen() 函数得到的,它返回的是字符串中的字符数量,不包括结尾的空字符 \0。简而言之就是为了保持与C语言字符串处理函数的一致性。


在这里插入图片描述

  • max_size:
    返回字符串可以达到的最大长度。
void TestString4()
{string s1("hello world");cout << s1.max_size() << endl;
}

注:
max_size的值取决于实现和系统资源。不同编译器或者不同平台的实现可能会有所不同


在这里插入图片描述

  • capacity:
    返回当前为字符串分配的存储空间的大小,以字节表示
void TestString5()
{string s1("hello world");cout << s1.capacity() << endl;
}

说到string的分配储存空间,就说一下string的扩容机制

string的扩容机制

首先我们看下main的代码:

void Viewcapacity()
{string s;size_t sz = s.capacity();cout << "capacity changed: " << sz << '\n';cout << "making s grow:\n";for (int i = 0; i < 100; i++){s.push_back('c');if (sz != s.capacity()){sz = s.capacity();cout << "capacity changed:" << sz << '\n';}}
}

在这里插入图片描述
我们可以看出第一次扩容是二倍扩容[ capacity是没包含‘\0’的,15+‘\0’=16 -> 31+‘\0’=32]
而之后都是1.5倍扩容

有意思的是在Linux下是这种情况:
在这里插入图片描述
我们可以看到是一直二倍进行扩容

在不同的操作系统和编译器下可能会有所不同,这主要是因为底层的内存分配策略和系统资源限制不同。
其实STL是一个规范,规范功能,没有规定实现细节


在这里插入图片描述

  • clear:
    清除字符串的内容,使其成为一个空字符串(长度为0个字符)。
void TestString6()
{string s1("hello world");cout << s1 << endl;cout << "capacity:" << s1.capacity() << endl;s1.clear();cout << s1 << endl;cout << "capacity:" << s1.capacity() << endl;
}

在这里插入图片描述
我们可以看出clear可以清除数据但是并没有销毁空间

那么有没有销毁空间的接口呢?
在C++11中新增了个这个接口:
在这里插入图片描述

  • shrink_to_fit:
    请求字符串减少其容量以适合其大小,就是缩容

那么

void TestString6()
{string s1("hello world xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");cout << s1 << endl;cout << "capacity:" << s1.capacity() << endl;s1.clear();cout << s1 << endl;cout << "capacity:" << s1.capacity() << endl;s1.shrink_to_fit();cout << s1 << endl;cout << "capacity:" << s1.capacity() << endl;
}

在这里插入图片描述
可见capacity缩小,之所以这样(hello world后面全是x)是因为我们现在可以理解为shrink_to_fit缩不到0,至于原因简单来说:shrink_to_fit 函数的作用是让 std::string 的容量(也就是它最多能装多少字符)缩小到刚好能装下它当前有的字符数量。如果 std::string 里面有15个字符,那么调用 shrink_to_fit 后,它的容量就会缩小到刚好能装下这15个字符的大小。这样做可以节省内存,因为不再需要多余的空间来装更多的字符了。


在这里插入图片描述

  • reserve:
    请求更改容量请求将字符串容量调整为最多n个字符的计划大小更改,说白了就是扩容
    详细来说:reserve()std::string 类的一个成员函数,它的作用是预先分配足够的内存空间,以便将来可以存储更多的字符,而不需要频繁地重新分配内存。当你知道 std::string 将会增长到一定的大小时,你可以使用 reserve() 来提前分配足够的空间。这样做可以减少内存分配的次数,提高程序的效率,因为频繁的内存分配和释放可能会导致性能下降。
void TestString7()
{string s1;s1.reserve(100);cout << "capacity:" << s1.capacity() << endl;
}

在这里插入图片描述
诶,我明明是开100个空间为什么是111?
这和扩容机制类似虽然reserve(100) 这个函数调用告诉 std::string 对象预先分配至少100个字符的空间。但是,std::string 的实际容量可能会比100大这也是因为底层的内存分配策略和系统资源限制不同。
注:reserve只能扩容,比capacity大才会起作用反之不会起作用


在这里插入图片描述

  • resize:
    将字符串的大小调整为n个字符的长度
    当你调用 resize(n) 时,字符串的大小会被设置为 n ,并且如果字符串当前大小小于 n ,那么会在字符串末尾添加额外的空字符(‘\0’)来填充到新的大小。如果字符串当前大小已经大于或等于 n ,那么 resize() 会截断字符串,只保留前 n 个字符。

那么我们会有这三种情况:
1.n比size小(如图中插入10)
2.n比size大但是比capacity小(如图中插入20)
3.n比capacity还要大(如图中插入30)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/707499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot226经方药食两用服务平台

经方药食两用服务平台的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定经方药食两用…

RK3568平台 RTC时间框架

一.RTC时间框架概述 RTC&#xff08;Real Time Clock&#xff09;是一种用于计时的模块&#xff0c;可以是再soc内部&#xff0c;也可以是外部模块。对于soc内部的RTC&#xff0c;只需要读取寄存器即可&#xff0c;对于外部模块的RTC&#xff0c;一般需要使用到I2C接口进行读取…

nebula容器方式安装:docker 安装nebula到windows

感谢阅读 基础环境安装安装docker下载nebula 安装数据库命令行安装查询network nebula-docker-compose_nebula-net并初始化查询安装初始使用root&#xff08;God用户类似LINUX的root&#xff09; 关闭服务 安装UI 基础环境安装 安装docker 点我下载docker 下载nebula 数据…

(2024,Sora 逆向工程,DiT,LVM 技术综述)Sora:大视觉模型的背景、技术、局限性和机遇回顾

Sora: A Review on Background, Technology, Limitations, and Opportunities of Large Vision Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. 背景 2.1…

Presto简介、部署、原理和使用介绍

Presto简介、部署、原理和使用介绍 1. Presto简介 1-1. Presto概念 ​ Presto是由Facebook开发的一款开源的分布式SQL查询引擎&#xff0c;最初于2012年发布&#xff0c;并在2013年成为Apache项目的一部分&#xff1b;Presto 作为现在在企业中流行使用的即席查询框架&#x…

求字符串所有整数最小和 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 1.输入字符串s输出s中包含所有整数的最小和&#xff0c;说明&#xff1a;1字符串s只包含a~z,A~Z,,-&#xff0c; 2.合法的整数包括正整数&#xff0c;一个或者多…

C 嵌入式系统设计模式 13:中断模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之六&…

跨境电商与支付介绍

1、跨境电商定义和分类&#xff1b; 2、国际贸易清结算&#xff1b; 3、跨境支付&#xff1b; 1、跨境电商定义和分类 跨境电商业务简单说就是指不同国家地域的主体通过电子商务进行交易的一种业务模式。同传统的电商不同&#xff0c;交易双方属于不同的国家。因此&#xff0…

flask知识--01

flask介绍 # python 界的web框架&#xff1a; Django&#xff1a;大而全&#xff0c;使用率较高 &#xff1a;https://github.com/django/django -FastAPI&#xff1a;新项目选择使用它&#xff1a;https://github.com/tiangolo/fastapi -flask&#xff1a;公司一些…

Mysterious-GIF-攻防世界-MISC

题目简介&#xff1a; 下载得到gif文件&#xff0c;十六进制编辑器查看&#xff0c;发现末尾有50 4B 03 04文件头。提取后保存为zip文件。 解压该zip文件&#xff0c;得到temp.zip。十六进制编辑器查看temp.zip&#xff0c;会发现有多个文件头和文件尾。 用binwalk分离temp.zi…

如何在windows系统部署Lychee网站,并结合内网穿透打造个人云图床

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

接口测试的测试要点

接口测试的测试要点&#xff0c;你知道都有哪些吗&#xff1f; 接口测试是软件测试中的重要组成部分&#xff0c;它的目的是评估接口的质量和可靠性&#xff0c;以保证系统的正常运行。在进行接口测试时&#xff0c;必须要考虑到以下几个方面&#xff1a; 测试用例的编写 测试…

ts的重载

官网示例 这里大概理解是 T 继承了Number|sting 加上&#xff1f;条件判断就是 T继承Number|sting 部分为true 没有继承部分为false&#xff0c; 就是输入string, 为true, 输入 null 则为false, type Exclude<T, U> T extends U ? never : T; // 相当于: type A …

CS_上线三层跨网段机器(完整过程还原)

以前讲过用cs_smb_beacon上线不出网机器&#xff0c;但是真实的网络拓扑肯定不止这么一层的网络&#xff01; 所以我就来搭建一个复杂一点的网络环境&#xff01;&#xff01; 当然了&#xff0c;这三台电脑之间都是不同的网段&#xff0c;&#xff08;但是同属于一个域环境&a…

golang学习7,glang的web的restful接口结构体传参

接口&#xff1a; //POST请求 返回json 接口传参json r.POST("/postJson", controller.PostUserInfo) 1.定义结构体 //定义结构体 type Search struct {Id intName string }2.结构体传参 //结构体传参 func PostUserInfo(c *gin.Context) {search : &Searc…

Qt6.8 GRPC功能使用(2)标准 Qt实现客户端

简介 基于之前的文章所说&#xff0c; Qt6.7之后才开始支持客户端、服务端、及双向流&#xff0c;恰好电脑需要重装&#xff0c;看到Qt6.8版本就直接安装了&#xff0c;内容也是使用Qt6.8的版本进行编译的 客户端实现步骤 1. 安装Qt6.8, 包含GRPC功能模块 Qt 6.8安装目录下包…

5G网络介绍

目录 一、网络部署模式 二、4/5G基站网元对标 三、4/5G系统架构对比 四、5G核心单元 五、边缘计算 六、轻量化&#xff08;UPF下沉&#xff09; 方案一&#xff1a;UPF下沉 方案二&#xff1a;UPF下沉 方案三&#xff1a;5GC下沉基础模式 方案四&#xff1a;…

05 动力云客之分页查询用户 + 查询用户详情 + 新增用户

1. 用户列表分页查询实现 核心 使用pageHelper实现分页 GetMapping(value "api/users")//分页的参数可以不传, 不传就默认设置为1public R userPage(RequestParam(value "current", required false) Integer current) {if (current null) {current …

docker下gitlab安装配置

一、安装及配置 1.gitlab镜像拉取 docker pull gitlab/gitlab-ce:latest2.运行gitlab镜像 docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always --privilegedtrue -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v …

table展示子级踩坑

##elemenui中table通过row中是否有children进行判断是否展示子集&#xff0c;通过设置tree-prop的属性进行设置&#xff0c;子级的children的名字可以根据自己的子级名字进行替换&#xff0c;当然同样可以对数据处理成含有chilren的子级list。 问题&#xff1a; 1.如果是根据后…