C++STL详解(一)——string类的接口详解(下)

目录

一.string的大小和容量成员函数

1.1size()和length()

1.2capacity()

1.3resize()

 1.4reserve()

1.5clear()和empty()

​编辑 二.string元素的访问

2.1operator[]和at()

2.2范围for

三.string中迭代器相关函数

3.1begin()和end()

3.2rbegin()和rend()

四.string与字符串之间的转换

五.string中子串的提取

5.1substr()

5.2通过copy()提取子串。

六.string中的运算符重载

6.1operator+操作符

6.2输入输出操作符

七.string中getline函数

 八.后记


一.string的大小和容量成员函数

1.1size()和length()

在C语言中,我们可以通过下式来计算字符数组中有多少个元素

	sizeof(arr[0]) / sizeof(arr);

在string库中,有如下两个接口可以计算元素个数:

	size();length();

如下图所示:

虽然这两个函数都可以完成对元素个数的计算,但我们更推荐使用size()函数计算元素的个数。

这是因为在STL中,都重载了size()这个函数,却没有重载length()函数。

1.2capacity()

capacity()函数用来获取字符串开的空间。

size_t capacity() const;

在这里需要大家注意的是,capacity表示开辟的空间大小,而size求出的是开辟的空间内的元素个数。因此这两个数是可以不相等的。

 如下图:

我们发现,我们开了15个空间存储这个字符串,但是只用了其中的七个空间。 

1.3resize()

resize是改变当前字符串有效字符个数的函数。 

void resize (size_t n);
void resize (size_t n, char c);

resize规则:

  • 当n大于对象当前的size时,将size扩大到n,扩大的字符为c,若c未给出,则默认为’\0’。
  • 当n小于对象当前的size时,将size缩小到n。 

我们可以通过下图的代码来验证上述规则: 

另外,值得一提的是,如果resize给出的值大于capacity的值的话,会调用扩容函数。

 1.4reserve()

reserve()是操作设置capacity的函数。函数原型如下:

void reserve (size_t n = 0);

 reserve规则:

  • 当n大于对象当前的capacity时,将capacity扩大到n或大于n。
  • 当n小于对象当前的capacity时,将capacity缩小或什么也不做。

我们可以通过下图来验证上图的规则:

这里需要我们大家注意两点内容

  1. reserer()函数并不会影响到字符串内的字符数据。
  2. reserve()在一些编译器中也可能会缩容。 

1.5clear()和empty()

clear()函数用来清空字符串内的字符数据。 

void clear();

clear规则:

  • 字符数据清除掉,使其成为空字符串
  • size设置为0 

实例如下: 

 empty函数进行判空,即判断字符串是否为空字符串。

bool empty() const;

如果字符串为空的话,则返回真。

如果字符串不为空的话,则返回假。

 
二.string元素的访问

2.1operator[]和at()

string元素的访问有两种方式,我们可以通过重载的[]访问,也可以通过at函数访问。

   char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;char& at (size_t pos);
const char& at (size_t pos) const;

由于两者都是传引用返回,因此两者都可以修改数据。

我们先使用operator[]来进行实践: 

现在我们通过at来进行实践:

  

2.2范围for

同样的,我们也可以通过范围for来访问和修改字符串内的数据。

我们可以使用下图中的方式来访问数据:

但是,在使用范围for修改数据时,则需要我们传引用了,否则e只是对象元素的拷贝,对e的修改不会影响到对象的元素。

因此,使用范围for修改数据的正确方法如下:

		for (auto& e : str){e = 'x';}

三.string中迭代器相关函数

3.1begin()和end()

begin函数:返回一个指向字符串第一个字符的迭代器。

end函数:返回一个指向字符串结束字符的迭代器,即’\0’。

函数原型如下:

    iterator begin();const_iterator begin() const;iterator end();const_iterator end() const;

 我们同样可以通过迭代器来访问和修改数据,如下所示: 

string str("xiaoqiulaoshi");
string::iterator it1 = str.begin();
while (it1 != str.end())
{cout << *it1 << ' ';it1++;
}
cout << endl;//x i a o q i u l a o s h i
string::iterator it2 = str.begin();
while (it2 != str.end())
{*it2='x';it2++;
}
cout << str << endl;//xxxxxxxxxx

3.2rbegin()和rend()

在string库中,还提供了反向迭代器rbegin和rend。

rbegin函数:返回指向字符串最后一个字符的反向迭代器。

rend函数:返回指向字符串第一个字符前面的理论元素的反向迭代器。

函数原型如下:

    iterator rbegin();const_iterator rbegin() const;iterator rend();const_iterator rend() const;

为了方便大家理解,我们来画图表示rbegin和rend的指向。


四.string与字符串之间的转换

在学习过数据结构之后,我们知道实现一个string类,私有成员需要有char* 、size、capacity。

如果我们只需要char*的话,则可以通过c_str()函数来进行转换。

我们将c_str()转换过来的字符串称为C字符串/C风格字符串。也就是我们上文中说的字符序列。

函数原型如下: 

const char* c_str() const;

使用方法如下:

const char* str2 = s.c_str();


五.string中子串的提取

我们有两种方法提取子串,分别是通过substr提取以及通过copy出一个字符串的部分字符到另外一个字符串中。

5.1substr()

函数原型如下:

string substr (size_t pos = 0, size_t len = npos) const;

我们可以通过下面的代码提取子串: 

int main()
{	string s1("abcdef");string s2;//substr(pos, n)提取pos位置开始的n个字符序列作为返回值s2 = s1.substr(2, 4);cout << s2 << endl; //cdefreturn 0;
}

5.2通过copy()提取子串。

 函数原型如下:

size_t copy (char* s, size_t len, size_t pos = 0) const;

 我们可以通过如下方法来提取子串:

int main()
{string s("abcdef");char str[20];//copy(str, n, pos)复制pos位置开始的n个字符到str字符串size_t length = s.copy(str, 4, 2);//copy函数不会在复制内容的末尾附加'\0',需要手动加str[length] = '\0';cout << str << endl; //dcefreturn 0;
}


六.string中的运算符重载

我们在前面的内容中已经介绍了很多操作符,现在我们再介绍几个操作符。

6.1operator+操作符

operator+操作符和operator+=操作符的作用是类似的。

重载后的+操作符支持如下操作:

 string类 + string类
 string类 + 字符串
 字符串 + string类
 string类 + 字符
 字符 + string类

譬如如下代码: 

int main() {// 定义字符串和字符string str1 = "Hello";string str2 = "World";const char* cstr = " C++";char ch = '!';// 1. string类 + string类string result1 = str1 + str2;cout << "string + string: " << result1 << endl; // 输出 "HelloWorld"// 2. string类 + 字符串 (C风格字符串)string result2 = str1 + cstr;cout << "string + C-style string: " << result2 << endl; // 输出 "Hello C++"// 3. 字符串 + string类string result3 = cstr + str2; // C风格字符串 + string类cout << "C-style string + string: " << result3 << endl; // 输出 " C++World"// 4. string类 + 字符string result4 = str1 + ch;cout << "string + char: " << result4 << endl; // 输出 "Hello!"// 5. 字符 + string类string result5 = ch + str1; // char + string类cout << "char + string: " << result5 << endl; // 输出 "!Hello"return 0;
}

6.2输入输出操作符

我们的string中也重载了输入输出操作符。

	void test15(){string s;cin >> s;//输入cout << s<< endl;//输出}

我们可以通过这个操作来输入和输出函数。

但是,我们发现了一个问题,如果我们输入的字符串中有空格的话 则空格后的字符会进入缓冲区。

因此,我们便可以用到getline函数。


七.string中getline函数

在用>>进行输入操作时,当>>读取到空格便会停止读取,基于此,我们将不能用>>将一串含有空格的字符串读入到string对象中。

这时,我们就需要用getline函数完成一串含有空格的字符串的读取操作了。

getline()函数的原型如下:

istream& getline (istream& is, string& str);

getline函数将从is中提取到的字符存储到str中,直到读取到换行符’\n’为止。

int main()
{string s;getline(cin, s); //输入:hello kcout << s << endl; //输出:hello kreturn 0;
}

 同样的,getline也可以自定义分隔符delim终止。

这个版本的getline原型如下:

istream& getline (istream& is, string& str, char delim);

这个函数将从is中提取到的字符存储到str中,直到读取到分隔符delim或换行符’\n’为止。 

int main()
{string s;getline(cin, s, 'D'); //输入:hello CSDNcout << s << endl; //输出:hello CSreturn 0;
}

 八.后记

string类的接口上是这篇博文:string接口上

有关string类的模拟实现可参考此片博文:string的模拟实现

如果你想更深入的了解string类函数的使用方法,可参考cpp官网:cpp官网

码字不易,给个点赞收藏叭~~~

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

机械学习—零基础学习日志(高数12——反三角函数)

零基础为了学人工智能&#xff0c;真的开始复习高数 反三角函数很困难&#xff0c;但是当建立了逻辑链条&#xff0c;还是能快速理解的。这个办法就是笛卡尔坐标系。 三角函数与反三角函数的个人理解 sinx与cosx&#xff0c;tanx&#xff0c;secx&#xff0c;其实都可以放在…

react中简单的配置路由

1.安装react-router-dom npm install react-router-dom 2.新建文件 src下新建page文件夹&#xff0c;该文件夹下新建login和index文件夹用于存放登录页面和首页&#xff0c;再在对应文件夹下分别新建入口文件index.js&#xff1b; src下新建router文件用于存放路由配置文件…

加速下载,揭秘Internet Download Manager2024下载器的威力!

1. Internet Download Manager&#xff08;IDM&#xff09;是一款广受欢迎的下载管理软件&#xff0c;以其强大的下载加速功能和用户友好的界面著称。 IDM马丁正版下载如下: https://wm.makeding.com/iclk/?zoneid34275 idm最新绿色版一键安装包链接&#xff1a;抓紧保存以…

C++学习笔记——模板

学习视频 文章目录 模板的概念函数模板函数模板语法函数模板注意事项函数模板案例普通函数与函数模板的区别普通函数与函数模板的调用规则模板的局限性 类模板类模板与函数模板区别类模板中成员函数创建时机类模板对象做函数参数类模板与继承类模板成员函数类外实现类模板分文件…

JS基础知识学习笔记全

JS基础知识学习笔记全 一、引入方式 1、内部脚本 &#xff08;一般定义在body下面会改善执行速度&#xff09; <body></body><!-- 内部脚本 --><script>/* 打开页面警告框显示的内容 */alert(helloJS);</script>2、外部脚本 外部专门新建一…

Nginx系列-10 realIp模块使用

背景 Nginx对每个模块都有说明文档&#xff0c;可参考:https://nginx.org/en/docs/ 当请求被代理后&#xff0c;真实客户端相对服务器被隐藏&#xff0c;即服务端无法判断HTTP消息来源。 如上图所示&#xff0c;IP分别为100.100.100.1和100.100.100.2的两个客户端向服务器200.…

TransformerEngine

文章目录 一、关于 TransformerEngine &#xff1f;亮点 二、使用示例PyTorchJAXFlax 三、安装先决条件Dockerpip从源码使用 FlashAttention-2 编译 四、突破性的变化v1.7: Padding mask definition for PyTorch 五、FP8 收敛六、集成七、其它贡献论文视频最新消息 一、关于 Tr…

traefik 2

不在白名单里的&#xff0c;就不能访问 允许谁访问&#xff0c;就把它加进来 traefik 高级应用 1. 负载均衡 关键在ingressroute 添加多个 svc 验证 就是找一台&#xff0c;配好host, 然后 两个svc 权重都是1&#xff0c;改一下就成了灰度分布 2. 灰度发布 关键在于…

立创梁山派--移植开源的SFUD和FATFS实现SPI-FLASH文件系统

本文主要是在sfud的基础上进行fatfs文件系统的移植&#xff0c;并不对sfud的移植再进行过多的讲解了哦&#xff0c;所以如果想了解sfud的移植过程&#xff0c;请参考我的另外一篇文章&#xff1a;传送门 正文开始咯 首先我们需要先准备资料准备好&#xff0c;这里对于fatfs的…

Chapter 10 Python数据容器:字符串

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、字符串的定义二、字符串的下标索引三、字符串的常用操作&#xff08;方法&#xff09;四、字符串的遍历 前言 在 Python 中&#xff0c;数据容器是组织和管理数据的…

NC 二叉树的最大深度

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 求给定二叉树…

com.mysql.cj.jdbc.Driver 爆红

出现这样的问题就是pom.xml文件中没有添加数据库依赖坐标 添加上这个依赖即可&#xff0c;添加完后重新加载一下Maven即可。 如果感觉对你有用就点个赞&#xff01;&#xff01;&#xff01;

加密货币换法拉利!BTC和ETH可买超跑,满足加密富豪需求!未来继续扩张全球市场!

全球知名的意大利豪华跑车制造商法拉利&#xff08;Ferrari&#xff09;正在跟随时代潮流&#xff0c;加速在全球范围内推广其加密货币支付系统。这一举措旨在进一步满足加密货币持有者对奢侈品的需求&#xff0c;并拥抱日益普及的数字资产。 2023年10月&#xff0c;法拉利在美…

一文掌握YOLOv1-v10

引言 YOLO目标检测算法&#xff0c;不过多介绍&#xff0c;是基于深度学习的目标检测算法中最出名、发展最好的检测器&#xff0c;没有之一。本文简要的介绍一下从YOLOv1-YOLOv10的演化过程&#xff0c;详细技术细节不过多介绍&#xff0c;只提及改进点&#xff0c;适合初学者…

美团大众点评字符验证码

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(…

昇思MindSpore学习入门-高阶自动微分

mindspore.ops模块提供的grad和value_and_grad接口可以生成网络模型的梯度。grad计算网络梯度&#xff0c;value_and_grad同时计算网络的正向输出和梯度。本文主要介绍如何使用grad接口的主要功能&#xff0c;包括一阶、二阶求导&#xff0c;单独对输入或网络权重求导&#xff…

宠物空气净化器是不是智商税?央视推荐狗毛空气净化器分享

宠物空气净化器是不是智商税&#xff1f;是众多宠物主人在考虑是否购置宠物空气净化器时心中最大的疑问。作为呼吸科医生&#xff0c;我建议&#xff0c;在保护呼吸健康方面&#xff0c;任何投资都是值得的。特别是对于养有猫狗的家庭来说&#xff0c;宠物所带来的各种污染物和…

一次性解决 | 网站被提示“不安全 ”

当网站被提示“不安全”时&#xff0c;这通常意味着用户的个人信息、登录凭证和其他敏感数据可能面临风险。为了一次性解决这个问题&#xff0c;可以从一下方面入手。 一、检查并启用HTTPS协议 检查URL&#xff1a;确保网站地址以“https://”开头&#xff0c;而非“http://”…

HTML常见标签——超链接a标签

一、a标签简介 二、a标签属性 href属性 target属性 三、a标签的作用 利用a标签进行页面跳转 利用a标签返回页面顶部以及跳转页面指定区域 利用a标签实现文件下载 一、a标签简介 <a>标签用于做跳转、导航&#xff0c;是双标签&#xff0c;记作<a></a>&#…

【Linux C | 网络编程】进程池小文件传输的实现详解(二)

上一篇实现了一个最基本的进程池&#xff1a;客户端读取标准输入&#xff0c;发送给服务端&#xff0c;服务端回复一个相同的内容。 【Linux C | 网络编程】简易进程池的实现详解&#xff08;一&#xff09; 这篇内容在上篇进程池的基础上实现小文件的传输。 文件传输的本质…