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

news2024/9/21 3:16:46

一、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.coloradmin.cn/o/2150970.html

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

相关文章

玩具车检测系统源码分享

玩具车检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

zynq SDK 关于SD卡报错

在修改了BD的部分代码之后&#xff0c;重新综合工程生成bit&#xff0c;之后刷新hdf文件&#xff0c;在SDK端就出现了SD卡相关的函数未定义的报错&#xff1a; Description Resource Path Location Type E:\Work\VivadoPrj\Prj1\project_1\project_1.sdk\Test\Debug/…/src/hel…

arm开发板通信

c语言复习 查询Ubuntu版本&#xff08;18.04&#xff09;和内核&#xff08;5.4&#xff09; 查询使用软件的版本号 arm开发板通信- 直播视频-- 项目第二天下午 2024-09-20 linux和windows下操作开发板前提是开发板中已经导入系统 以下是具体操作 linux下开发板的操作 li…

Java项目实战II基于Java+Spring Boot+MySQL的读书笔记共享平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在信息爆炸…

无人机黑飞打击技术详解

随着无人机技术的普及&#xff0c;无人机“黑飞”&#xff08;未经授权或违反规定的飞行&#xff09;现象日益严重&#xff0c;对公共安全、隐私保护及重要设施安全构成了严重威胁。为有效应对这一挑战&#xff0c;各国政府和安全机构纷纷研发并部署了一系列无人机黑飞打击技术…

龙头名企HR数字创新:超8成参调企业上线电子签

近日&#xff0c;法大大与人力资源智享会&#xff08;以下简称“智享会”&#xff09;联合发布了《第七届人力资源共享服务中心研究报告》&#xff08;点击阅读及下载&#xff1a;最新&#xff01;《第七届人力资源共享服务中心研究报告》重磅来袭&#xff09;&#xff0c;该报…

反转字符串中的单词--力扣151

反转字符串中的单词 题目思路代码 题目 思路 题目的难点在于首先要清除多余的空格&#xff0c;并且单词之间要留一个空格&#xff0c;首单词前和末尾单词后不能有多余空格。我们使用双指针去除所有的空格&#xff0c;然后在处理完一个单词后手动加一个单词。具体思路是当快指针…

李沐 过拟合和欠拟合【动手学深度学习v2】

模型容量 模型容量的影响 估计模型容量 难以在不同的种类算法之间比较,例如树模型和神经网络 给定一个模型种类,将有两个主要因素: 参数的个数参数值的选择范围 VC维

GBDT算法原理及其公式推导过程

GBDT&#xff08;Gradient Boosting Decision Tree&#xff0c;梯度提升决策树&#xff09;是一种集成学习方法&#xff0c;主要用于回归和分类任务。它的基本思想是通过迭代地构建一系列弱学习器&#xff08;通常是决策树&#xff09;&#xff0c;并将这些弱学习器组合成一个强…

C++11 新的类功能

前言 上一期我们对右值引用和完美转发作了介绍&#xff0c;本期我们接着上期继续介绍C11的新的类功能&#xff01; 目录 前言 • 新的类功能 默认成员函数 类成员变量初始化 强制生成默认函数的关键字default 禁止生成默认成员函数的关键字delete 继承和多态中的final…

流动网红打卡车!苏州金龙海格双层巴士带你体验别样津门津韵

近日&#xff0c;由文化和旅游部主办&#xff0c;天津市文化和旅游局等单位承办的2024中国文化旅游产业博览会在天津拉开帷幕&#xff0c;展会期间&#xff0c;来自全国各地的文旅产品精彩亮相。而在天津交通集团展台&#xff0c;来自苏州金龙海格客车制造的网红双层观光“音乐…

redis安装(以6.0.13为例)

redis-6.0.13安装 1.创建安装目录2. 上传安装包3. 替换repo文件4.依赖安装5. redis安装5.1 解压5.2 编译5.3 安装5.4 配置 6. 常用命令 1.创建安装目录 mkdir -p /apps/scripts/ cd /apps/scripts/2. 上传安装包 将redis-6.0.13.tar.gz 上传至/apps/scripts/目录下 下载链接…

一站式语音识别服务:中文、方言、多语言全覆盖

在当今全球化与多元化的社会背景下&#xff0c;语音识别技术的需求日益增长。智匠MindCraft凭借其先进的语音识别功能&#xff0c;不仅覆盖了标准的中文识别&#xff0c;还扩展到了多种方言和多国语言的识别&#xff0c;为用户提供了一站式的语音转文本解决方案。 技术亮点 1…

c# 视觉识别图片文字 二维码

1.二维码识别 插件 ZXing.Net using System; using System.Drawing; // 如果你使用的是System.Drawing.Common using ZXing;class Program {static void Main(){string imagePath "path_to_your_qr_code_image.png";var barcodeBitmap (Bitmap)Image.FromFile(im…

9.20哈好

函数体 #include"SeqList.h"void SeqList::init(int n) {this->ptrnew data[n];this->len0;this->sizen; }bool SeqList::empty() {return this->len0; }bool SeqList::full() {return this->sizethis->len; }void SeqList::push_back(data e) {i…

Zookeeper安装使用教程

# 安装 官网下载安装包 #配置文件 端口默认8080&#xff0c;可能需要更改一下 #启动 cd /Users/lisongsong/software/apache-zookeeper-3.7.2-bin/bin ./zkServer.sh start #查看运行状态 ./zkServer.sh status #停止 ./zkServer.sh stop #启动客户端 ./zkCli.sh ls /

Linux:Bash中的文件描述符

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的所有进程&#xff0c;都拥有自己的文件描述符(File Descriptor, FD)&#xff0c;它是操作系统在管理进程和文件时的一种抽象概念。每个文件描述符由一个非负整…

在渗入测试和峰谷测试中选Flat还是Ramp-up?

前面的一篇文章中我们为大家介绍了在基准测试和规划测试中选Flat还是Ramp-up&#xff0c;具体应该怎么配置&#xff0c;在这篇文章里&#xff0c;我们继续为大家介绍在渗入测试和峰谷测试中选Flat还是Ramp-up&#xff1f; 渗入测试&#xff08;疲劳强度测试&#xff09; 使用固…

vue-ts-demo

npm i -g vue/cli PS D:\kwai\vue3\project> vue create vue3-te-demo element-plus 一个 Vue 3 UI 框架 | Element Plus https://element-plus.org/zh-CN/guide/installation.html 安装&#xff1a; npm install element-plus --save 完整引入使用&#xff1a; 使用&…

AI大模型微调实战训练营,文旅对话 知识库 大模型实战(模型参数微调)

一、引言 随着人工智能技术的飞速发展&#xff0c;AI大模型在各个领域的应用日益广泛。其中&#xff0c;大模型微调作为一种强大的工具&#xff0c;能根据特定任务定制化模型性能&#xff0c;尤其在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;文旅对话和知识库构建…