【C++】string类(上)

在这里插入图片描述

个人主页~


string

  • 一、标准库中的string类
    • 1、什么是string类
    • 2、string类的常用接口讲解
      • (1)string类的常见构造
      • (2)string类的容量操作
      • (3)string类对象的访问及遍历
      • (4)string类对象的修改
      • (5)string类非成员函数
      • (6)其他
      • (7)vs和g++下string结构说明
        • vs下的string结构
        • g++下string结构

一、标准库中的string类

1、什么是string类

(1)字符串是表示字符序列的类,string是表示字符串的字符串类
(2)标准的字符串提供了对此类对象的支持,其接口类似于标准字符容器的接口与常规容器的接口基本相同,但添加了专门用于操作单字节字符字符串的设计特性,也就是专门用来操作string的常规操作
(3)string类是使用char作为它的字符类型
(4)string类是basic_string模版类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数
在这里插入图片描述

basic_string<char> s1;
string s2;
//这两个是一样的,string就是basic_string的char类型特化
typedef basic_string<char, char_traits, allocator> string;//底层

(5)不能操作多字节或者变长字符的序列
(6)在使用时要包头文件以及展开命名空间

2、string类的常用接口讲解

(1)string类的常见构造

函数名称功能说明
string()构造空的字符串
string(const char* s)用C格式的字符串构造字符串
string(const string& s)拷贝构造函数
string(size_t n,char c)字符串中包含n个字符c
void test()
{string s1;string s2("hello world");string s3(s2);string s4(5, 'a');
}

在这里插入图片描述

(2)string类的容量操作

函数名称功能说明
size返回字符串有效字符长度
empty检测字符串是否为空,是返回true,否返回false
clear清空有效字符
reserve为字符串预留空间
resize将有效字符个数改为n个,多出的空间用字符c填充
capacity总空间大小
length返回字符串有效字符长度
void test2()
{string s1("hello world");cout << s1 << endl;//测试size和lengthcout << s1.size() << endl;cout << s1.length() << endl;//size和length底层实现原理完全相同,在刚刚创造出string的时候,对于字符串来说,叫length很合适,//所以起名为length,但不久后STL产生了,为了与其他的模版比如list,vector等统一,//所以加了size,保持接口一致性,一般都用size//测emptycout << s1.empty() << endl;//测capacitycout << s1.capacity() << endl;//测resizes1.resize(5, 'a');cout << s1 << endl;s1.resize(15, 'a');cout << s1 << endl;//resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符个数改到n个,//不同的是当字符个数增多时,resize(size_t n)用0来填充多出的元素空间,//resize(size_t n,char c)用c字符填充多出的元素空间//resize改变元素个数时,如果个数增多,可能会改变底层容量的大小,如果减少则不变//测reserves1.reserve(15);cout << s1.capacity() << endl;//为string预留空间,如果reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小//测clears1.clear();cout << s1.capacity() << endl;s1 += "little monster";//+=在后边有讲解cout << s1 << endl;//clear只是将string中有效字符清空,不改变底层大小,可以再键入新内容
}

在这里插入图片描述

(3)string类对象的访问及遍历

函数名称功能说明
operator[ ]返回pos位置的字符,const string类调用
begin 和 endbegin获取一个字符的迭代器,end获取最后一个字符的后一个位置的迭代器
rbegin 和 rendrbegin获取一个字符的迭代器,rend获取最后一个字符的后一个位置的迭代器
范围for更简洁的遍历
void test3()
{string s1("hello world");cout << s1[6] << endl;//使用下标操作符[]可以直接找到对应位置的字符//string::iterator it = s1.begin();auto it = s1.begin();//这里体现出了auto的优越性,上面一长串的类型可以直接用auto推导代替for (it; it != s1.end(); it++){cout << *it << " ";}cout << endl;
//begin记录第一个有效字符的位置,end记录最后一个有效字符的后一个位置
//从头到尾的打印,++是一个重载运算符,在其他类中,包括链表类也可以直接找到下一个成员for (auto it : s1){cout << it << " ";}cout << endl;
//使用范围for进行遍历,十分方便auto rit = s1.rbegin();for (rit; rit != s1.rend(); rit++){cout << *rit << " ";}
//rbegin和rend是一对与begin和end相反的函数,rbegin记录的是最后一个有效字符的位置,rend记录的是第一个有效字符的前一个位置,通过++实现逆向输出
}

在这里插入图片描述

(4)string类对象的修改

函数名称功能说明
operator+=在字符串后追加字符串
c_str返回C格式字符串
find从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
push_back在字符串后尾插字符
append在字符串后追加一个字符串
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回
void test4()
{string s1("hello world");//+=测试s1 += "!!!!";cout << s1 << endl;//c_str测试cout <<s1.c_str() << endl;//c_str就是将c++的格式转化为c语言的格式,这样字符串就可以用C语言的方式来操作//并且c_str返回的是指针,因为<<是重载运算符,所以才显示指向的内容//find测试cout << s1.find('w',2) << endl;//pushback测试s1.push_back('6');cout << s1 << endl;//append测试s1.append("789");cout << s1 << endl;//rfind测试cout << s1.rfind('l' , 6) << endl;//substr测试cout << s1.substr(0, 11) << endl;//substr只会截取并返回,不改变s1的内容
}

在这里插入图片描述
在string尾部追加字符时,可以使用push_back , append , += ,push_back只能追加字符,append追加字符串,所以我们一般常用的是+=,既可以追加字符又可以追加字符串,并且使用起来书写简单,代码可读性高

对string进行操作时,如果可预见可以放多少字符,可以用reserve把空间预留好

这里的 find 和 rfind 与 begin rbegin 那一套一样,r都表示相反,注意这里find是从pos开始往后找到的第一个指定字符,rfind是从pos开始往前找到的第一个指定字符,然后返回该字符所在位置的下标

(5)string类非成员函数

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

这部分内容比较简单,我设置了超链接,直接点进去看一下文档就可以了

(6)其他

string类还有很多其他的操作,不一一列举了,需要时直接打开cplusplus查找文档即可
string类
在这里插入图片描述
在这里插入图片描述

(7)vs和g++下string结构说明

前提:32位平台

vs下的string结构

string总共占28个字节,内部结构稍微复杂一点,有一个联合体,用来定义string中字符串的存储空间:当字符串长度小于16时,使用内部固定的字符数组存放,当字符串长度大于等于16时,从堆上开辟空间,这样保证了字符串在较小时不需要通过堆创建,提高了效率,占16字节

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

最后还有一个指针,4字节,共28字节

g++下string结构

在g++下,string通过写时拷贝实现,只占4个字节,内部只包含一个指针,指向一块堆空间,堆空间内部包含了空间总大小、字符串有效长度、引用计数

写时拷贝:在数据第一次写入到某个存储位置时,首先将原有内容拷贝出来,写到另一位置处,然后再将数据写入到存储设备中,该技术只拷贝在拷贝初始化开始之后修改过的数据
简单来说就是在用之前不开空间,在真正要修改和写入时才开辟空间,可以减少空间的浪费,它是在浅拷贝的基础上增加了引用计数的方式实现的

引用计数:用来记录资源使用者的个数,在构造时,将资源的计数给成1,每增加一个对象使用该资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该对象是该资源的最后一个使用者,将该资源释放,否则因为其他对象还在使用该资源,该资源就不能释放


今日分享就到这里~

在这里插入图片描述

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

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

相关文章

Java语言程序设计——篇七(2)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 封装性与多态 封装性与访问修饰符类的访问权限类成员的访问权限 &#x1f320;防止类扩展和方法覆盖实战演练 抽象类实战演练 对象转换实战演练…

lambda表达式,真题示例

Lambda表达式 它使代码更加简洁、易读&#xff0c;函数式编程增强了代码的表达力。常用于对集合的操作&#xff0c;如遍历、过滤、转换等。 Lambda表达式的形式&#xff1a; 参数&#xff0c; 箭头&#xff08;->) 以及一个表达式&#xff1a; (String first, String sec…

Android P Input设备变化监听 Storage设备变化监听

InputManager.java中实现了InputDeviceListener接口&#xff0c;只需要新建一个类 implements InputDeviceListener &#xff0c;并且将类实例化注册给InputManager.getInstance().registerInputDeviceListener即可。 StorageManager同理 StorageManager中会调用StorageEventL…

还手动抄字幕?学会这3个视频转文字方法,轻松提取视频中的字幕!

大家有尝试过考试前极限抱佛脚吗&#xff1f; 在下不才&#xff0c;曾经试过一次&#xff0c;轻松在及格线低空飘过【大家不要学不要学不要学&#xff0c;重要的事情说三遍&#xff01;&#xff01;&#xff01;】 至于我当时究竟是怎么做到的呢&#xff1f;其实这里面有点小…

网络原理_初识

目录 一、局域网LAN 二、广域网WAN 三、网络通信基础 3.1 IP地址 3.2 端口号 3.3 协议 3.4 五元组 3.5 OSI七层模型 3.6 TCP/IP五层模型 3.7 网络设备所在分层 3.8 封装和分用 总结 一、局域网LAN 局域网&#xff0c;即 Local Area Network&#xff0c;Local 即标…

“微软蓝屏”全球宕机,敲响基础软件自主可控警钟

上周五&#xff0c;“微软蓝屏”“感谢微软 喜提假期”等词条冲上热搜&#xff0c;全球百万打工人受此影响&#xff0c;共同见证这一历史性事件。据微软方面发布消息称&#xff0c;旗下Microsoft 365系列服务出现访问中断。随后在全球范围内&#xff0c;包括企业、政府、个人在…

【定积分】

框架 概念&#xff0c;性质定积分计算基本特色变限积分及其导数反常积分&#xff08;广义积分&#xff09;定积分应用面积体积 讲解 1.概念&#xff0c;性质&#xff1a; 定积分就是求出曲线的面积&#xff1b;性质中要注意几个不等式的比较 2.定积分计算&#xff1a; 基本&…

物理机 gogs+jenkins+sonarqube 实现CI/CD

一、部署gogs_0.11.91_linux_amd64.tar.gz gogs官网下载&#xff1a;https://dl.gogs.io/ yum -y install mariadb-serversystemctl start mariadbsystemctl enable mariadbuseradd gittar zxvf gogs_0.11.91_linux_amd64.tar.gzcd gogsmysql -u root -p < scripts/mysql.…

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配&#xff01;有了上次的内容铺垫&#xff0c;我们可以根据用户的token来判定&#xff0c;到底是显示什么内容了。 1&#xff1a;我们在对应的导航组件内修改完善一下内容即可。 <script setup> import { useUserSt…

svn软件总成全内容

SVN软件总成 概述&#xff1a;本文为经验型文档 目录 D:\安装包\svn软件总成 的目录D:\安装包\svn软件总成\svn-base添加 的目录D:\安装包\svn软件总成\tools 的目录D:\安装包\svn软件总成\tools\sqlite-tools-win32-x86-3360000 的目录D:\安装包\svn软件总成\安装包-----bt lo…

C#调用OpenCvSharp实现图像的角点检测

角点检测用于获取图像特征&#xff0c;以支撑运动检测、目标识别、图像匹配等方面的应用。常用的角点检测算法包括Kitchen-Rosenfeld算法、Harris算法、KLT算法、SUSAN算法等&#xff0c;本文学习并测试Harris角点检测算法。   关于Harris算法的数学原理请见参考文献1的第18、…

C++内存管理和模板/stl初识

前言 c兼容C语言&#xff0c;但它因为有类和对象的概念&#xff0c;C语言原生的那套内存管理函数在特定场景下还是有些捉襟见肘的&#xff0c;为此c在C语言的基础上引入新的内存管理方案&#xff0c;今天我们就来简单的认识一下c的内存管理。除此之外&#xff0c;模板也是c引入…

Jetpack Compose 通过 OkHttp 发送 HTTP 请求的示例

下面是一个使用 Kotlin 和 Jetpack Compose 来演示通过 OkHttp 发送 HTTP 请求的示例。这个示例包括在 Jetpack Compose 中发送一个 GET 请求和一个 POST 请求&#xff0c;并显示结果。 添加okhttp依赖 首先&#xff0c;在你的 build.gradle.kts 文件中添加必要的依赖&#xf…

父子组件生命周期的执行顺序

在Vue中&#xff0c;父子组件的生命周期执行顺序是一个重要的概念&#xff0c;它帮助开发者理解组件之间的加载、更新和销毁过程。以下是对父子组件生命周期执行顺序的详细解释&#xff1a; 一、加载渲染过程 当Vue实例开始创建时&#xff0c;会按照以下顺序执行生命周期钩子…

PACS医学影像临床信息系统,C#影像归档和通信系统源码,PACS源码,支持图像的获取、传输、浏览、打印、测量、重建、对比、存储、处理,电子胶片影像管理等

医学影像临床信息系统具有图像采集、显示、存储、传输和管理等功能&#xff0c;支持DICOM影像设备和非DICOM影像设备&#xff0c;可以识别CT、MR、CR/DR、X光、DSA、B超、NM、SC等设备的图像类型&#xff0c;可对数字影像进行无损压缩和有损压缩处理。C/S体系结构的多媒体数据库…

STM32智能照明控制系统教程

目录 引言环境准备智能照明控制系统基础代码实现&#xff1a;实现智能照明控制系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能照明控制系统通…

独立游戏《星尘异变》UE5 C++程序开发日志8——实现敏感词过滤功能(AC自动机)

在游戏中经常会有需要玩家输入一些内容的功能&#xff0c;例如聊天&#xff0c;命名等&#xff0c;这款游戏只有在存档时辉用到命名功能&#xff0c;所以这个过滤也只是一个实验性的功能&#xff0c;我们将使用AC自动机来实现&#xff0c;这是在我们把“csdn”这个词设置为屏蔽…

解决zabbix-server7 中文乱码问题

系统使用centos9 安装中文支持 yum install -y fontconfig langpacks-zh_CN.noarch 检查是否已有中文字体&#xff1a; fc-list :langzh 看到 直接使用GOOGLE的字体 ln -fs /usr/share/fonts/google-noto-cjk/NotoSansCJK-DemiLight.ttc /etc/alternatives/zabbix-web-fo…

bool数组的理解和应用[C++]

文章目录 bool数组的用法bool数组的定义声明bool数组的初始化访问和修改数组元素遍历数组 运用bool数组简单代码 在今天做题中发现了bool类不仅能用于函数类型还能用于数组类型&#xff0c;好奇查了查发现bool还有很多用处&#xff1a;基本变量&#xff0c;在枚举类型中会用到&…

【C语言】结构体详解 -《探索C语言的 “小宇宙” 》

目录 C语言结构体&#xff08;struct&#xff09;详解结构体概览表1. 结构体的基本概念1.1 结构体定义1.2 结构体变量声明 2. 结构体成员的访问2.1 使用点运算符&#xff08;.&#xff09;访问成员输出 2.2 使用箭头运算符&#xff08;->&#xff09;访问成员输出 3. 结构体…