С++第十三节课 string初体验

一、string类的相关函数

string实际上也就是一个管理字符的顺序表!

如果我们需要遍历一个字符串,怎么实现?

我们可以通过下标访问操作符 + size实现字符串的遍历!

int main()
{string s1("hello world");// 遍历一个字符串cout << s1 << endl;for (size_t i = 0; i < s1.size(); i++){cout << s1[i];}return 0;
}
  • '/0'不是一个有效字符,是一个标识字符串结束的特殊字符;
  • size()统计不计算/0的数量;
for (size_t i = 0; i <= s1.size(); i++)

当i = s1.size()的时候, 此时已经访问到/0,但是vs下的编译器不打印;

还可以通过下标引用操作符进行内容的修改:

int main()
{string s1("hello world");// 遍历一个字符串//cout << s1 << endl;for (size_t i = 0; i < s1.size(); i++){cout << s1[i]++;}return 0;
}

这里,内置类型和自定义类型的[]实际意义不一样!

	string s1("hello world");char s3[] = "hello world";s1[1]++;s3[1]++;

二、迭代器

可以将iterator想象成指针,但是它不一定是指针!

  • begin获取一个字符串的迭代器;
  • end获取最后一个字符下一个位置的迭代器(/0);

iterator是一个像指针一样的类型!有可能是指针(字符串中是指针),有可能不是指针!

用法和指针几乎一致!

	string::iterator it = s1.begin();while (it != s1.end()){(*it)--;++it;}

可以通过修改迭代器的值,用法与指针类似;

注意点:范围for

	// 范围for// 通过范围for进行修改for (auto& ch : s1){ch++;}// 通过范围for进行打印for (auto ch:s1){cout << ch << " ";}return 0;
}
  • 范围for中的ch是s1对象的每个字符的拷贝,然后操作后会自动迭代;
  • 因为ch是s1对象的拷贝,因此我们需要加上引用,否则对ch的修改无法影响s1;

范围for的底层实际上就算迭代器!自动迭代实际上就算++来实现的!

范围for会调用begin和end来实现工作!

因此,一个类不支持迭代器就不会支持范围for(例如栈stack)!

任何的容器都支持迭代器,并且用法是相似的!

	vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(14);vector<int>::iterator vit = v1.begin();while (vit != v1.end()){cout << *vit << " " ;vit++;}

 总结:

  • iterator提供了一种统一的方式访问和修改容器的数据;
  • 算法(algorithm)可以通过迭代器处理容器中的数据;

上面是采用隐式实例化,根据不同的参数调用不同的函数;在这里构成了函数重载;

如果我们想要逆向遍历一个字符串

  • 可以取反向迭代器
	string s1("hello world");string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){cout << *(rit);rit++;}
}

  • 此时,反向迭代器rbegin指向字符串的最后一个字母;
  • rend指向字符串的前一个位置;

同时,有了auto可以省略的类型:

	string s1("hello world");//string::reverse_iterator rit = s1.rbegin();auto rit = s1.rbegin();

分析下面的代码:

void Func(const string& s)
{string::iterator it = s.begin();while (it != s.end()){(*it)--;++it;}
}

这个代码无法编译通过!

这是因为const不能使用普通的迭代器,要使用const迭代器!(相当于权限的放大)

普通迭代器可以读可以写,但是const迭代器只能读(不能修改)!

同理,对于const rbegin来说只能读不能写!

共有上面四种迭代器;

string因为历史的原因,产生的比STL要早一些,因为之前string的长度都是length,为了和其他的SLT一致,引入size,其功能与strlen一样!

三、算法初体验

 max_size在不同编译器运行的结果不一样,因此在实际使用上没有什么用处;

capacity是返回当前字符串的存储空间,但是对于不同的编译环境下capacity的数值是不一样的! 

相同的代码,在vs下的capacity的值为15,在g++的编译条件下为11!(这是因为两个编译器用的STL的版本不一样!)

我们可以通过下面的代码查看vs下的扩容机制:

每次扩容大概为原来的1.5倍!

同样的代码,我们来查看Linux系统下的扩容机制:

g++下几乎为2倍扩容!

  • vs的19扩容机制:每次默认给15(实际上是16,省去后面的/0),然后每次扩容为原来的1.5倍;
  • g++的扩容机制:当前字符串长度为多少,即默认扩容数为多少,每次扩容到原来的2倍;

clear的作用:清除字符串的内容,将字符串改为空字符串;

分析下面的代码:

	string s1("hello world");cout << s1.size() << endl;cout << s1.capacity() << endl;s1.clear();cout << s1.size() << endl;cout << s1.capacity() << endl;

可以发现vs2022的扩容机制是默认给定的capacity是字符串的长度!

且clear只是将字符串中的有效字符清除,但是容量capacity不发生改变!

同样的,Linux环境下也是将size清为0,capacity不发生改变!

四、练习题:字符串相加

. - 力扣(LeetCode)

两个整形相加,一个整型最大值为42亿多,如果我们需要相加的数字比42亿还多,可以采用字符串相加!

class Solution {
public:string addStrings(string num1, string num2) {int end1 = num1.size()-1;int end2 = num2.size()-1;string Strret;int carry = 0;  // 定义进位值while(end1 >=0 || end2 >=0){int val1 = end1 >= 0 ? num1[end1]-'0':0 ;int val2 = end2 >= 0 ? num2[end2]-'0':0 ;int ret = val1 + val2 + carry;  // 当前位数相加之和; carry = ret / 10;ret = ret % 10;// Strret += ('0'+ret);  // 因为是从后往前算,这里是用尾插Strret.insert(Strret.begin(),'0'+ret);  // 采用头插--end1;--end2;}// 出循环后如果还需要进位if (carry == 1){//Strret +='1';Strret.insert(Strret.begin(),'1');}//reverse(Strret.begin(),Strret.end());return Strret;}
};

但是需要注意的是,头插的效率比尾插的效率低!

 

tong图像 小部件

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

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

相关文章

不可思议的效率飞跃:RPA如何重塑你的工作流程,释放人力潜能!

RPA简介 机器人流程自动化&#xff08;Robotic Process Automation&#xff0c;简称RPA&#xff09;是一种模拟人类用户操作的软件技术&#xff0c;它通过自动化执行重复性、规律性强的任务来提高工作效率和准确性。RPA软件机器人可以模拟鼠标点击、键盘输入、数据复制粘贴等操…

anaconda的windows新手安装及配置教程(适用于物联网工程、计算机专业)

第一步:点击免费下载 点击我直达anaconda官网">——>点击我直达anaconda官网 第二步:跳过注册 第三步:下载windows版本 第四步:安装步骤 1.Next (下一步) 2.I Agree (我同意) 3.默认即可,下一步 4.安装地址可以选到D盘,如果没有默认也行,只是一个…

OpenAI GPT o1技术报告阅读(4)- 填字游戏推理

✨继续阅读报告&#xff1a;使用大模型来学习推理(Reason) 原文链接&#xff1a;https://openai.com/index/learning-to-reason-with-llms/ 这次我们继续看一个填字游戏的案例。 我们先看下问题&#xff1a; 解决以下填字游戏&#xff1a; Across&#xff08;横向&#xff09…

推荐2024年好用的4款日语翻译工具

日语在学习研究&#xff0c;商务合作&#xff0c;旅游文化交流等多个领域还是占有着一个比较重要的作用&#xff0c;将中日两种语言进行准确地翻译能够这些活动更加高效有益地进行和发展。因此好的翻译工具便尤为重要&#xff0c;今天我也给大家挑选了几款优秀地日语翻译工具。…

可视化工具箱-Visualization Toolkit(VTK)

一、Visualization Toolkit&#xff08;VTK&#xff09;简概 可视化工具箱&#xff08;VTK&#xff09;&#xff0c;是一个用于3D计算机图形、图像处理和科学可视化的开源软件系统&#xff0c;其包含C类库和Tcl/Tk、Java与python的解释型接口层。VTK支持各种可视化算法&#xf…

电机设计及电机仿真APP系列之—轴向磁通电机仿真APP

电机的各种工作状态和参数变化。用户可通过调整仿真参数&#xff0c;快速得到电机的响应和性能参数&#xff0c;从而进行针对性的优化和改进。借助仿真APP&#xff0c;可大大减少电机设计迭代次数和成本&#xff0c;提高测试效率和准确性。 小编整理了10款不同类型的电机仿真A…

前端vue-v-for循环遍历

&#xff08;item,index&#xff09;in list中&#xff0c;index这个索引可加可不加&#xff0c;item代表list中的每一个元素&#xff0c;list可以是数组&#xff0c;也可以是对象&#xff0c;要遍历谁就把 &#xff08;item,index&#xff09;in list加在哪里。 关于加不加&a…

BUUCTF-MISC-隐藏的钥匙

下载题目文件&#xff0c;获得了一张格式为jpg的路飞图片 按照习惯&#xff0c;首先使用十六进制编译器打开文件&#xff0c;这里我使用winhex打开文件 首先考虑有没有flag直接隐写在文件中&#xff0c;按照图示步骤查找flag字段 我们查到了flag&#xff0c;通过经验和图中base…

MySQL的缓存策略

目录 一、MySQL 缓存方案用来干什么 二、提升MySQL访问性能的方式 1、读写分离&#xff08;MySQL的主从复制&#xff09; 2、连接池 3、异步连接 三、缓存方案是怎么解决的 1、缓存与MySQL一致性状态分析 2、制定热点数据的读写策略 四、缓存方案问题的解决方法 1、缓…

正点原子阿尔法ARM开发板-IMX6ULL(八)——串口通信(寄存器解释)(补:有源蜂鸣器)

文章目录 一、蜂鸣器&#xff08;待&#xff0c;理解&#xff09;1.1 第一行1.2 第二行1.3 第三行 二、串口原理2.1 通信格式2.2 UART寄存器 一、蜂鸣器&#xff08;待&#xff0c;理解&#xff09; 1.1 第一行 对于第一行&#xff0c;首先先到fsl_iomuxc文件里面寻找IOMUXC_S…

人力资源数据集分析(一)_t-test、卡方检验和描述性统计

数据入口&#xff1a;人力资源分析数据集 - Heywhale.com 数据说明 字段说明EmpID唯一的员工IDAge年龄AgeGroup年龄组Attrition是否离职BusinessTravel出差&#xff1a;很少、频繁、不出差DailyRate日薪Department任职部门&#xff1a;研发部门、销售部门、人力资源部门Dista…

【VUE3.0】如何得到一张像素风格的图片?

目录 引言网络途径获取代码转换已有的图片0. 先看效果1. 上传图片&#xff0c;这个没什么好说的&#xff0c;前端上传图片基本操作。2. 通过滑动条提供一个1-10的数字&#xff0c;用于放缩图片画质。3. 函数拿到图片资源后先对图片进行缩小100倍尺寸处理&#xff0c;此时画质已…

服务器非法关闭后MySQL服务启动失败

在写这篇文章前&#xff0c;我弄好了&#xff0c;写完之后把成功安装的几个MySQL都删除了&#xff0c;只留了最后测试成功的服务“mysql-test” ,然后点击运行&#xff0c;发现又出现上图的错误。心态炸了。 本以为定位到问题了&#xff0c;但是这个错误让我迷茫了。我只能临时…

为什么你的广告规模无法扩大

许多跑facebook的广告主可能都遇到过这样的情况&#xff0c;小额测试广告的时候效果不错&#xff0c;一旦加预算想扩大规模广告往往就会崩掉&#xff0c;始终无法把广告提升一个level,如果你尝试了很多投放策略调整都无法挽救的话&#xff0c;可能问题是出在广告素材上。 对于一…

多重指针变量(n重指针变量)实例分析

0 前言 指针之于C语言&#xff0c;就像子弹于枪械。没了子弹的枪械虽然可以用来肉搏&#xff0c;却失去了迅速解决、优雅解决战斗的能力。但上了膛的枪械也非常危险&#xff0c;时刻要注意是否上了保险&#xff0c;使用C语言的指针也是如此&#xff0c;要万分小心&#xff0c;…

杀死端口占用的进程

1、查看端口的进程&#xff0c;以9023为例 &#xff08;1&#xff09;方法1 netstat -tunpl|grep 9023 &#xff08;2&#xff09;方法2 ss -tulpan |grep 9023 &#xff08;3&#xff09;方法3 netstat -ntlp |grep 9023 &#xff08;4&#xff09;方法4 lsof -i:9023 …

A Simple Encoder-Decoder for Open-Vocabulary Semantic Segmentation

FAM: Feature Aggregation Module&#xff0c;Circle with R represents removing feature maps of non-selected categories 辅助信息 权重有1.3G&#xff0c;不建议复现

变压器空载时是否有必要做无功补偿

在电力系统中&#xff0c;变压器作为关键设备之一&#xff0c;其运行状态对整个系统的功率质量和效率具有重要影响。关于“变压器空载时是否有必要做无功补偿”这一问题&#xff0c;答案取决于具体的应用场景、系统需求以及经济性考虑。以下将从变压器空载特性、无功补偿的原理…

360手机黑科技“位置穿越”功能修复 360位置穿越使用

​ 360手机刷机 360手机黑科技 360手机位置穿越 360手机位置修复 360手机站&#xff1a;360os.top 资源免费下载: os.360os.top 备用资源站&#xff1a;360手机-360手机刷机RootTwrp 360手机位置穿越 360手机位置穿越‌&#xff0c;是一款虚拟定位软件&#xff0c;无需进行r…

毕业设计选题:基于springboot+vue+uniapp的驾校报名小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…