【C++】string(一)

大家好,我是苏貝,本篇博客带大家了解C++的string类,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • 1. 标准库中的string类
    • 1.1 string类(了解)
    • 1.2 string类的常用接口说明
      • (A) string类对象的常见构造函数
        • a.string()
        • b.string(const char* s)
        • c.string(const string& str)
      • (B) 迭代器iterators
        • a. begin/end
        • b.rbegin/rend
        • c.cbegin/cend/crbegin/crend
      • (C) 容量capacity
        • a.size/length
        • b.max_size(了解)
        • c.capacity
        • d.resize
        • e.reserve
        • f.clear
        • g.empty
        • h.shrink_to_fit

1. 标准库中的string类

1.1 string类(了解)

  1. 字符串是表示字符序列的类
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits 和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
  5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

总结:

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string string;
  4. 不能操作多字节或者变长字符的序列。

在使用string类时,必须包含#include以及using namespace std;

1.2 string类的常用接口说明

在下面链接中有string类的所有接口信息,但我们后面只了解常用的接口
string

(A) string类对象的常见构造函数

在这里插入图片描述

我们只了解上图的(1)(2)(4),其它的根据上图的解释也能看懂

a.string()

在这里插入图片描述

这是空参构造,也是默认构造
作用:构造一个空的string对象,对象的长度是0
在这里插入图片描述

上图中可以使用cout<<s的原因是string实现了<<运算符重载

b.string(const char* s)

在这里插入图片描述

复制由 s 指向的以 null 结尾的字符序列(C 字符串)。
这里的C字符串是指末尾有“\0”的字符串,如字符数组,”aaa”,const char* p=”aa”

在这里插入图片描述

c.string(const string& str)

在这里插入图片描述

拷贝构造

在这里插入图片描述

(B) 迭代器iterators

在这里插入图片描述

迭代器是一个行为像指针的类型对象,但不是指针。用typeid来证明迭代器不是指针
在这里插入图片描述

a. begin/end

在这里插入图片描述
在这里插入图片描述

成员函数begin()的返回值是指向string的第一个字符的迭代器。成员函数end()的返回值是指向string的最后一个字符的下一个字符的迭代器。

string的字符串底层一定有表结束的’\0’,因为string的底层就是用C语言的字符数组实现的,C语言的字符串用’\0’作为结束标志。但是我们认为string的最后一个字符是’\0’的前一个字符,因此end()返回的迭代器一般都指向’\0’

在这里插入图片描述
在这里插入图片描述

它们通常配合遍历操作使用

如果s没有被const修饰,那么可以通过迭代器修改string

在这里插入图片描述
在这里插入图片描述

begin()和end()也可以用const修饰,如果有const string,那么该string不能被修改,且const string调用begin()/end()时,返回值类型是const_iterator

在这里插入图片描述

b.rbegin/rend

在这里插入图片描述
在这里插入图片描述

rbegin()的返回值是指向string的最后一个字符的反向迭代器。rend()的返回值是指向string的第一个字符的前一个字符的反向迭代器。
在这里插入图片描述

注意:反向遍历时,rid还是++而不是–

在这里插入图片描述

因此一共有4类迭代器

在这里插入图片描述

c.cbegin/cend/crbegin/crend

这四个成员函数都是C++11新增的,其实它们和const修饰的begin/end/rbegin/rend是一样的

在这里插入图片描述

在这里插入图片描述

© 容量capacity

在这里插入图片描述

a.size/length

size()和length()的返回值相同,都是返回string的长度。
注意:它们都不算’\0’

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们一般都用size

b.max_size(了解)

在这里插入图片描述

返回string最大可到的长度
在这里插入图片描述

最大值是不固定的,可能在某些编译器的某些平台下会是42亿多

c.capacity

在这里插入图片描述

返回的是开辟的空间,capacity>=size

在这里插入图片描述

d.resize

在这里插入图片描述

修改string的长度为n

resize()有3种情况:

  1. n<size:删除

  2. size<n<capacity:插入

  3. n>capacity:扩容+插入

  4. n<size,string的长度变为n,删除n之后的数据

在这里插入图片描述

  1. size<n<capacity,string的长度变为n,size以后的元素初始化为形参c,如果没有传形参c,就初始化为’\0’

传参
在这里插入图片描述

没传参

在这里插入图片描述

  1. n>capacity,扩容+插入

传参:
在这里插入图片描述

不传参

在这里插入图片描述

注意:resize用的不多

e.reserve

在这里插入图片描述

作用:请求改变capacity。当n>capacity时,扩容,使得capacity>=n。当n<capacity时,不做处理

reserve和反向迭代器的reverse相似,前者是保留,后者是反转
在这里插入图片描述

在这里插入图片描述

reserve()一般用于知道要插入多少数据,提前开好空间的情况。它避免了扩容,提高效率。相较于resize,reservs用的更多

f.clear

在这里插入图片描述

作用:清空string,即删除string的内容,让size==0。但不会销毁空间

在这里插入图片描述

g.empty

在这里插入图片描述

作用:测试string是否是空的,即测试string的size是否为0

在这里插入图片描述

h.shrink_to_fit

在这里插入图片描述

作用:请求缩容,但是缩容后的capacity还是要>=size

但是编译器不一定真的会缩容

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

新版Apache tomcat服务安装 Mac+Window双环境(笔记)

简介&#xff1a;Tomcat服务器器的下载和安装&#xff1a; 安装前提 1&#xff09;电脑需要有java环境&#xff0c;jdk8以上&#xff0c;否则启动不不成功 2&#xff09;已经安装Sublime⽂文件编辑软件 3&#xff09;window电脑需要显示⽂文件拓拓展名 官网&#xff08;https:…

see的本质是什么?

see的本质是什么&#xff1f;see的本质&#xff0c;就是一条蛇&#xff1a; see s蛇 e眼 e眼 ee是两只大眼睛&#xff0c;长在蛇的脑袋上&#xff0c;代表着蛇头和跟随性观察。 如果你喜欢看【龙虎斗】&#xff0c;看【猫蛇大战】相关的视频&#xff0c;你会发现&#xff0c…

0x00基础算法 -- 0x05 排序

1、离散化 排序算法的第一个应用&#xff1a;离散化。 “离散化”就是把无穷大&#xff08;无限&#xff09;的集合中的若干个&#xff08;有限&#xff09;元素映射为有限集合以便于统计的方法。 例如&#xff1a;问题的范围定义在整数集合&#xff0c;但是只涉及其中m个有限的…

深度学习在边缘检测中的应用及代码分析

摘要&#xff1a; 本文深入探讨了深度学习在边缘检测领域的应用。首先介绍了边缘检测的基本概念和传统方法的局限性&#xff0c;然后详细阐述了基于深度学习的边缘检测模型&#xff0c;包括其网络结构、训练方法和优势。文中分析了不同的深度学习架构在边缘检测中的性能表现&am…

博物馆实景复刻:开启沉浸式文化体验的新篇章

随着数字化技术的飞速发展&#xff0c;博物馆的展览形式正在经历一场前所未有的变革。3数字博物馆和3D线上展览&#xff0c;这种创新的展览方式不仅打破了时间和空间的限制&#xff0c;更让文化遗产的保护与传承迈上了一个新的台阶。 本文将深入探讨博物馆实景复刻虚拟展厅的兴…

服务器上安装Orcale数据库以及PL SQL工具(中文)

一、前期准备 1、oracle数据库安装包–>Oracle下载地址&#xff0c;版本根据当时情况就下最新的就行&#xff0c;下载时间可能有点长&#xff0c;耐心点。 2、PL SQL工具下载地址–>PL SQL下载地址&#xff0c;百度网盘可以共享【限速&#xff0c;没办法&#xff01;&am…

除了 TON, 哪些公链在争夺 Telegram 用户?数据表现如何?

作者&#xff1a;Stella L (stellafootprint.network) 在 2024 年&#xff0c;区块链游戏大规模采用迎来了一个意想不到的催化剂&#xff1a;Telegram。随着各大公链争相布局这个拥有海量用户基础的即时通讯平台&#xff0c;一个核心问题浮出水面&#xff1a;这种用户获取策略…

JSON.stringify的应用说明

前言 JSON.stringify() 方法将 JavaScript 对象转换为字符串,在日常开发中较常用&#xff0c;但JSON.stringify其实有三个参数&#xff0c;后两个参数&#xff0c;使用较少&#xff0c;今天来介绍一下后两个参数的使用场景和示例。 语法及参数说明 JSON.stringify()&#xf…

java:接口,抽象,多态的综合小练习

package 综合抽象接口练习;public class person {protected String name;protected int age;person(){}person(String name,int age){this.namename;this.ageage;}public void setName(String name){this.namename;}public String getName(){return name;}public void setAge(i…

<AI 学习> 下载 Stable Diffusions via Windows OS

注意&#xff1a; 不能使用 网络路径 不再支持 HTTPS 登录&#xff0c;需要 Token 1. 获得合法的授权 Stability AI License — Stability AI 上面的链接打开&#xff0c;去申请 许可 2. 拥有 HuggingFace 账号 注册&#xff1a;https://huggingface.co/ 3. 配置 Tok…

【Visual Studio】设置文件目录

打开属性 输出目录&#xff1a;$(SolutionDir)bin\$(Platform)\$(Cinfiguration)\ 中间目录&#xff1a;$(SolutionDir)bin\intermediates\$(Platform)\$(Cinfiguration)\

linux病毒编写+vim shell编程

学习视频来自B站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 请一定遵循《网络空间安全法》&#xff01;&#xff01;&#xff01; Linux目录介绍 /bin 二进制可执行文件&#xff08;kali里面是工具一些文件&#xff09;/etc 系统的管理和配置文…

Hadoop 学习心得

一、引言 &#xff08;一&#xff09;学习 Hadoop 的背景和目的 随着信息技术的飞速发展&#xff0c;数据量呈爆炸式增长&#xff0c;传统的数据处理方式已难以满足需求。在这样的背景下&#xff0c;为了能够在大数据领域有所发展&#xff0c;我开始学习 Hadoop。Hadoop 作为处…

机器学习-35-提取时间序列信号的特征

文章目录 1 特征提取方法1.1 特征提取过程1.2 两类特征提取方法2 基于数据驱动的方法2.1 领域特定特征提取2.2 基于频率的特征提取2.2.1 模拟信号2.2.2 傅里叶变换2.2.3 抽取最大幅值对应特征2.2.4 抽取峰值幅值对应特征2.3 基于统计的特征提取2.4 基于时间的特征提取3 参考附录…

聊天服务器(9)一对一聊天功能

目录 一对一聊天离线消息服务器异常处理 一对一聊天 先新添一个消息码 在业务层增加该业务 没有绑定事件处理器的话消息会派发不出去 聊天其实是服务器做一个中转 现在同时登录两个账号 收到了聊天信息 再回复一下 离线消息 声明中提供接口和方法 张三对离线的李…

【CICD】CICD 持续集成与持续交付在测试中的应用

一、什么是CICD&#xff1f; CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xf…

arkUI:水果选择与管理:基于 ArkUI 的长按编辑功能实现

水果选择与管理&#xff1a;基于 ArkUI 的长按编辑功能实现 1 主要内容说明2 相关内容2.1 相关内容2.1.1 源码1内容的相关说明2.1.1.1 数据结构与状态管理2.1.1.2 添加水果功能2.1.1.3 水果列表展示2.1.1.4 长按进入编辑模式2.1.1.5 复选框的多选功能2.1.1.6 删除水果功能2.1.1…

操作系统实验:在linux下用c语言模拟进程调度算法程序

文章目录 1、实验内容2、实验结果及分析3、如何在linux下编写并执行c语言程序以及实验源代码gcc -o test test.c1、实验内容 1)用C语言编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。…

【鸿蒙开发】第十一章 Stage模型应用组件-任务Mission

目录 1 任务(Mission)管理场景 2 任务&#xff08;Mission&#xff09;与启动模式 2.1 singleton单实例模式 2.2 multiton多实例模式 2.3 specified指定实例模式 3 页面栈及任务链 3.1 页面栈 3.2 任务链 4 设置任务快照的图标和名称 4.1 设置任务快照的图标&#xf…

postgresql.conf与postgresql.auto.conf区别

1. 简介 PostgreSQL 9.4版本开始引入postgresql.auto.conf 配置文件&#xff0c;作为postgresql.conf文件的补充&#xff0c;在配置文件格式上&#xff0c;它和postgresql.conf保持一致 1.1 postgresql.conf 这是一个静态的参数文件&#xff0c;包含了数据库服务器的基本配置…