C++string类(2)

3.string类对象的访问及遍历操作

函数名称功能说明
operator[] (重 点)返回pos位置的字符,const string类对象调用
begin+endbegin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin+rendrbegin获取最后一个字符的迭代器 + rend获取第一个字符上一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式
void test1()
{string s1 = "gxlgxlgxlgxlgxl";cout << s1[0] << s1[1] << s1[2] << endl;
}void test2()
{string s1 = "gxlgxlgxlgxlgxl";//string::iterator it = s1.begin();auto begin = s1.begin();auto end = s1.end();cout << *begin << endl;cout << *(end - 1) << endl;//end指向最后一个字符的下一个位置,这里减1取最后一个位置while (begin != end){cout << *begin << endl;++begin;}}
void test3()
{string s1 = "gxlgxlgxlgxlgxl";auto rbegin = s1.rbegin();auto  rend = s1.rend();cout << *(rend - 1) << endl;//rend指向第一个字符的前一个位置,//但是在这个rend中我们想取第一个位置的字符要减1cout << *rbegin << endl;//rebegin指向最后一个字符while (rbegin != rend){cout << *rbegin << endl;++rbegin;}//输出为从字符串从后往前访问,即rbegin+1 是在从后往前走,//这也解释为何访问第一个位置要rend-1
}void test4()
{string s1 = "gxlgxlgxlgxlgxl";for (auto ch : s1){cout << ch << endl;}
}
int main()
{test1();test2();test3();test4();return 0;
}

4.string类对象的修改操作

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+= (重 点)在字符串后追加字符串str
c_str(重点)返回C格式字符串
find + npos(重 点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的 位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

5.string类非成员函数

函数功能说明
operator>> (重点)输入运算符重载
operator<< (重点)输出运算符重载
getline (重点)获取一行字符串
relational operators (重点)大小比较
operator+尽量少用,因为传值返回,导致深拷贝效率低

上面的几个接口大家了解一下,下面的OJ题目中会有一些体现他们的使用。string类中还有一些其他的操作,这里不一一列举,大家在需要用到时不明白了查文档即可。

6.vs和g++下string结构的说明

注意:下述结构是在32位平台下进行验证,32位平台下指针占4个字节。

vs下string的结构

string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义 string中字符串的存储空间:

当字符串长度小于16时,使用内部固定的字符数组来存放 。

当字符串长度大于等于16时,从堆上开辟空间。

union _Bxty
{ // storage for small buffer or pointer to larger onevalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;

这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。

其次:还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量

最后:还有一个指针做一些其他事情。

故总共占16+4+4+4=28个字节。

在这里插入图片描述

g++下string的结构

G++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:

1)空间总大小

2)字符串有效长度

3)引用计数

struct _Rep_base
{size_type               _M_length;size_type               _M_capacity;_Atomic_word            _M_refcount;
};

指向堆空间的指针,用来存储字符串。

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

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

相关文章

SQLShift:一款异构数据库存储过程迁移工具

SQLShift 是一款专注于解决企业级数据库迁移难题的智能 SQL 方言转换平台&#xff0c;尤其擅长异构数据库存储过程的自动化迁移。 SQLShift 工具深度融合了 AI 与 SQL 语法专家模型&#xff0c;可以大幅提升迁移效率并降低人工适配风险。 功能特性 多源多目标&#xff1a;目前…

学习设计模式《十八》——备忘录模式

一、基础概念 备忘录模式的本质是【保存和恢复内部状态】。 备忘录模式的思考序号备忘录模式的思考说明1保存是手段&#xff0c;恢复才是目的标准的备忘录模式保存数据的手段是通过内存缓存&#xff1b;广义的备忘录模式实现的时候&#xff0c;可以采用离线存储的方式&#xff…

HOT100——排序篇Leetcode215. 数组中的第K个最大元素

文章目录题目&#xff1a;Leetcode215. 数组中的第K个最大元素原题链接思路1代码1思路2代码2题目&#xff1a;Leetcode215. 数组中的第K个最大元素 原题链接 数组中的第K个最大元素 思路1 排序 排序后返回倒数第k个数 代码1 思路2 使用priority_queue&#xff0c;大根堆&#x…

三维重建一: 相机几何

参考这位大佬&#xff1a;https://zhuanlan.zhihu.com/p/458000359 一. 基本的投影模型 正如上面所说&#xff0c;相机是一个将三维物体投影为二维图像的设备。 对于小孔相机&#xff0c;或者薄透镜相机来说&#xff0c;基础投影的数学模型可以表达为 我们把这个过程表达在笛…

mysql 字符集不一致导致索引失效问题

mysql 字符集不一致导致索引失效问题 问题&#xff1a; 两张表&#xff0c;同一个字段&#xff0c;由于字符集不一致&#xff0c;导致虽然都有索引&#xff0c;在关联查询时&#xff0c;索引失效身份表 identity_info &#xff0c;查询索引信息 show index from identity_info …

Linux内核设计与实现 - 第6章 内核数据结构

目录1. 链表 (Linked Lists)2. 队列 (Queues)3. 映射 (Maps)4. 二叉树 (Binary Trees)5. 位图 (Bitmaps)6. 其他数据结构性能考量1. 链表 (Linked Lists) 单向链表 vs 双向链表 struct list_head 标准实现内核链表API&#xff1a;LIST_HEAD(), list_add(), list_del() 环形链表…

十五、K8s可观测能力:日志收集

十五、K8s可观测能力&#xff1a;日志收集 文章目录十五、K8s可观测能力&#xff1a;日志收集1、云原生日志框架-ECK介绍1.1 什么是ECK&#xff1f;1.2 ECK核心资源&#xff1a;1.3 生产级日志收集架构2、日志收集-ECK2.1 集群规划2.2 ECK 安装2.3 一键部署高可用 ES 集群2.4 一…

微服务变更?自动化测试利器Parasoft SOAtest修复快、准、稳!

微服务架构凭借灵活和可扩展的优势越来越普及&#xff0c;但随之而来的变更也成了开发团队的“心头大患”。服务之间依赖复杂&#xff0c;接口改来改去&#xff0c;不仅让开发更费劲&#xff0c;还容易导致测试用例失效、测试效率下降&#xff0c;甚至埋下系统不稳的隐患。 自…

将Android Studio创建的一个apk工程放到Android15源码中构建

背景描述&#xff1a;起初Android Studio创建的apk工程&#xff0c;为了方便系统版本发布和后期维护需要同时支持两种构建方式&#xff1a;Android Studio Gradle构建 IDE界面环境&#xff0c;对习惯java环境变成的友好、UI设计方便看效果Android15系统构建时自动构建 So…

yolo8目标检测+训练(识别和平精英人物)

✅步骤一&#xff1a;安装 PyTorch&#xff08;M1 专用&#xff09;# 推荐使用官方 MPS 后端&#xff08;Apple Metal 加速&#xff09; pip install torch torchvision torchaudio确认是否使用了 Apple MPS&#xff1a;import torch print(torch.backends.mps.is_available()…

【ArcGISPro】修改conda虚拟安装包路径

问题在ArcGISPro中经常使用克隆&#xff0c;导致C盘默认虚拟安装包内存越来越大&#xff0c;导致电脑很卡解决方案打开ArcGISPro所在conda文件夹D:\Program Files\ArcGIS\Pro\bin\Python\Scripts打开命令行工具&#xff08;如 CMD 或终端&#xff09;。输入以下命令&#xff0c…

三格电子—西门子PLC串口转网口模块

一、功能概述本文档是西门子PLC串口转以太网系列产品&#xff0c;包含SG-S7-200-ETH、S7-200-ETH(2P)&#xff0c;SG-S7-300-ETH&#xff0c;SG-S7-300-ETH(2P)共四个产品。使用框图如下图所示意。1.1 产品功能本系列产品用来给西门子S7-200/300 PLC串口扩展出网口来&#xff0…

Python—requests模块

Python requests 模块代码演示 requests 是 Python 中一个简单易用的 HTTP 库&#xff0c;用于发送各种 HTTP 请求。下面是一些常见的使用示例&#xff1a; 1. 基本 GET 请求 import requests# 发送 GET 请求 response requests.get(https://api.github.com)# 检查请求是否成功…

华为仓颉编程语言语法简介与示例

华为仓颉编程语言语法简介与示例 仓颉编程语言是华为自主研发的新一代通用编程语言&#xff0c;由南京大学冯新宇教授团队主导设计&#xff0c;于 2024 年华为开发者大会&#xff08;HDC&#xff09;正式发布&#xff0c;并在 2025 年 7 月推出首个长期支持版本&#xff08;LTS…

触发器的创建

- 建立product表&#xff0c;操作方式operate表要求1.定义触发器实现在产品表(product)中每多一个产品,就在操作表(operate)中记录操作方式和时间以及编号记录。注&#xff1a;操作说明&#xff1a;标记执行delete 、insert、update2.定义触发器实现在产品表(product)中每更新一…

论文略读: RASA: RANK-SHARING LOW-RANK ADAPTATION

ICLR 2025尽管 LoRA 有诸多优势&#xff0c;但近期研究表明&#xff0c;它在大规模训练数据集和复杂任务&#xff08;如数学推理和代码生成&#xff09;中&#xff0c;仍然落后于全参数微调&#xff08;FFT&#xff09;一个合理的解释是&#xff1a;低秩约束限制了 LoRA 的表达…

VSCode - VSCode 查找中文字符

VSCode 查找中文字符 1、查找中文字符使用快捷键 Ctrl F 打开查找框点击正则表达式按钮 .*在搜索框中输入 [\u4e00-\u9fa5]&#xff0c;这个范围涵盖了基本的中文字符2、查找中文字符串使用快捷键 Ctrl F 打开查找框点击正则表达式按钮 .*在搜索框中输入 [\u4e00-\u9fa5]&a…

SQL基础操作指南:增删改查入门

前言 在日常数据库操作中&#xff0c;掌握增删查改是每个开发者必备的技能。下面我将通过实例解析SQL的核心操作要点&#xff0c;帮你避开常见陷阱。一、新增数据&#xff08;INSERT&#xff09; 单行插入&#xff1a;明确指定字段和值 INSERT INTO 表名(字段1, 字段2) VALUES …

Linux系统安装Docker及部署Node.js 20.15.0(含pnpm、pm2)完整指南

前言&#xff1a;在应用项目部署中&#xff0c;“环境不一致”往往是开发与运维的痛点——本地能跑的代码到了服务器就报错&#xff0c;依赖版本、系统配置差异都可能成为隐患。而Docker的容器化技术恰好能解决这一问题&#xff0c;通过“一次构建&#xff0c;到处运行”的特性…

python的多线程无法并行只能并发,why?

标题python的多线程无法并行只能并发&#xff0c;why&#xff1f;python的多线程无法并行只能并发&#xff0c;why&#xff1f; 在 Python 中&#xff0c;特别是使用 CPython 解释器时&#xff0c;由于存在 全局解释器锁&#xff08;GIL&#xff09;&#xff0c;即使在多核处理…