[c++]—string类___深度学习string标准库成员函数与非成员函数

news2024/11/23 10:14:50
要相信别人能做出来自己一定可以做出来,只不过是时间没到而已

目录

🚩string类对象capacity操作

💻reserve()保留

 💻resize()

🚩string类对象元素访问操作

💻operator[]和at()

💻operator[]和at()函数有关越界访问 

 🚩string类对象修饰语操作

💻assign()

💻insert()

💻erase()

💻replace()

🎓replace()函数的应用

🚩string类字符串操作 

💻substr() 截取子字符串

💻find()函数

👉npos成员常量 

💻find()和substr()函数结合使用

💻rfind()函数 

🎓find()和rfind()的区别

🎓题目—字符串最后一个单词的长度

👉getline()

💻find_first_of()函数

💻find_last_of()函数 

🎓find_first_of()和find_last_of() 


我们接着上一章的学习。

🚩string类对象capacity操作

从上一章节介绍了,size()和length()记录的是string类对象的字符串长度, max_size()指的是string类容纳的最大长度,capacith指的是已分配存储的大小,clear表示清空string类对象。

这里只限定在vs环境下,不同的环境下的处理不同


💻reserve()保留

C++中的reserve函数被广泛用于容器类中,它的作用是预留一定量的内存空间来存储元素,以提高程序的效率。这个函数只影响容器的capacity(容量),而不改变该容器包含的元素个数。使用reserve函数可以避免频繁的动态内存分配和释放,减少内存碎片的产生,以提高代码的效率。


 💻resize()

c++中resize函数是c++标准库vector容器的一个成员函数,用于改变vector的大小。它可以使vector变大或变小,根据变化的大小,它可能会在vector的末尾添加新元素,或者从末尾删除元素。

第一个参数表示新的大小,第二个可选参数表示插入的新值(缺省为默认构造函数值,可以是一个默认值,也可以是一个可变参数模板包)。

这里给字符串长度设置成200,后面直接初始化成'\0',capacity肯定是大于200的。

第二个函数不仅开空间,而且 填值初始化为'x'。


再次调用resize()函数是不会改变capacity的值,因为你想想,开辟了200个字符的空间,然后只需要20的空间,剩下的180空间直接交给操作系统了,那这样造成了极大的浪费,一般我们都是拷贝那20空间给新的字符串,然后free那剩下的空间。而不是这样直接丢弃,编译器是不会允许你这样做的。所以capacity是不可改变的。

这里只限定在vs环境下,不同的环境下的处理不同,我们调用resize()函数至字符串长度为0,capacity也是不改变的。


🚩string类对象元素访问操作

💻operator[]和at

int main()
{
	string s1("chenle");
	s1.at(0)='z';
	cout << s1 << endl;
	s1[0] = 'z';
	cout << s1 << endl;
	return 0;
}


💻operator[]和at()函数有关越界访问 

int main()
{
	string s1("chenle");
	s1.at(0)='z';
	cout << s1 << endl;
	s1[0] = 'z';
	cout << s1 << endl;

	s1[15];
	s1.at(15);
	return 0;
}


at()函数越界抛异常 

 at()函数调用如果越界,那么会抛异常,用下面的格式就相对于调用operator[]函数相对温和一点的处理方式。

int main()
{
	try {
		string s1("hello world");
		s1.at(0) = 'x';
		cout << s1 << endl;
		//s1[15];  // 暴力处理
		s1.at(15); // 温和的错误处理
	}
	catch (const exception& e)
	{
		cout << e.what() << endl;
	}
	return 0;
}


 🚩string类对象修饰语操作

前面一篇文章我们讲了上面三个函数operator+=(),append(),push_back()。

💻assign()

int main()
{
	string s1("chenle");
	s1 += ("xxxxxx");
	cout << s1 << endl;
	s1.assign("sssssss");
	cout << s1 << endl;
	return 0;
}


💻insert()


💻erase()

int main()
{
	string s1("chenle");
	//删除第五个字符后面的一长度的字符
	s1.erase(5, 1);
	cout << s1 << endl;
	return 0;
}


string s1("chenle");
	cout << s1 << endl;
	s1.erase(3);
	cout << s1 << endl;


int main()
{
	string s2("hello world");
	/*s2.erase(0, 1);
	cout << s2 << endl;*/
	//利用迭代器,begin()函数,那么删除begin()所指的当前位置的字符
	s2.erase(s2.begin());
	//参数不是迭代器,是个数值,那么删除第三个元素后面的所有字符
	s2.erase(3);
	cout << s2 << endl;
	return 0;
}


💻replace()



🎓replace()函数的应用

int main()
{
	//将所有的空格都改成%20
	string s1("hello world hello bit");
	string s3;
	for (auto ch : s1)
	{
		if (ch != ' ')
		{
			s3 += ch;
		}
		else
		{
			s3 += "%20";
		}
	}
	s1 = s3;
	cout << s1 << endl;
	return 0;
}


🚩string类字符串操作 


💻substr() 截取子字符串

注意:这里需要创建一个新的string对象被子字符串初始化,因为截取字符串不改变原先的字符串。

int main()
{
	string s1("chenle zhangyaunfei");
	cout << s1 << endl;
	string s2;
	s2=s1.substr(7, 12);
	cout << s2 << endl;
	return 0;
}


💻find()函数


👉npos成员常量 

这里我需要介绍一下npos

  • npos可以表示string的结束位子,是string::type_size 类型的,也就是find()返回的类型。find函数在找不到指定值的情况下会返回string::npos

这里我需要打印出这段网址中的协议http。我们想要找到://,那么用string::npos,如果find函数找不到://,那么就返回string::npos。我们可以看到我们依次遍历找到了://,那么不返回string::npos,if判断为真,然后截取[0,pos1)字符串字段,然后打印出。

int main()
{
	string url = "https://legacy.cplusplus.com/reference/string/string/";
	// 协议pos1  域名protocol  资源名
	size_t pos1 = url.find("://");
	string protocol;
	if (pos1 != string::npos)
	{
		protocol = url.substr(0, pos1);
	}
	cout << protocol << endl;

	return 0;
}


一个网址由三个部分组成,协议,域名,资源名组成,我们要分别打印出协议的部分,域名的部分,资源名的部分,该如何使用find(),substr()函数呢?


💻find()和substr()函数结合使用

int main()
{
	string url = "https://legacy.cplusplus.com/reference/string/string/";
	// 协议protocol  域名  资源名
	size_t pos1 = url.find("://");
	string protocol;
	if (pos1 != string::npos)
	{
		protocol = url.substr(0, pos1);
	}
	cout << protocol << endl;

	string domain;//域名
	string uri;//资源名
	size_t pos2 = url.find('/', pos1 + 3);//从pos1+3位置开始找'/'
	if (pos2 != string::npos)
	{
		domain = url.substr(pos1+3,pos2-(pos1+3));//从pos1+3的位置,截取(pos2-(pos1+3))的长度,读到遇到第一个'/'位置
		uri = url.substr(pos2 + 1);//直接从pos2+1位置后读到最后即可
	}
	cout << domain << endl;
	cout << uri << endl;


	return 0;
}


💻rfind()函数 

逆向查字符或字符串,若查找成功,则返回逆向查到的第一个字符下标或第一个字符串首字符的下标;若查找失败,无法返回正确的下标。逆向查到的第一个字符或第一个字符串也就是正向的最后一个。rfind()函数的返回值为无符号整数类型。(rfind从后向前逆向查,但匹配是正向匹配的,可以参考下面代码多理解。)

str.rfind(“fab”,4);//从下标为4开始逆向查找,正向匹配,结果找不到,返回npos。
str.find(“fab”);//如果没有第二个参数,默认从下标npos开始。npos定义为保证大于任何有效下标的值。结果为5。


🎓find()和rfind()的区别

#include<iostream>
using namespace std;
int main()
{
    string str="abcdefab";
    cout<<str.find('a')<<endl;//正向找到,返回有效下标0。
    cout<<str.find('h')<<endl;//正向找不到,返回npos。
    cout<<str.find("ab",1)<<endl;//正向找到并返回ab的首字母a下标6。
    cout<<str.find("ab")<<endl;//没有第二个参数,默认从0下标开始正向查找,结果为0。正向查找,正向匹配。
    cout<<str.find("ha")<<endl;//正向找不到,返回npos。
    cout<<str.rfind('b')<<endl;//逆向找到并返回b的下标7。
    cout<<str.rfind('h')<<endl;//逆向找不到,返回npos。
    cout<<str.rfind('a',100)<<endl;
    //从下标100逆向查找,找到并返回a下标6。如果没有第二个参数,默认从下标npos开始。npos定义为保证大于任何有效下标的值。
    //如果要设置rfind()的第二个参数,那么一般情况下大于等于len-1就可以。
    cout<<str.rfind("fab")<<endl;//逆向找到,结果为5。
    cout<<str.rfind("fab",4)<<endl;//逆向找不到,返回npos。
    cout<<str.rfind("fab",5)<<endl;//逆向可以找到,结果为5。rfind从后向前逆向查,但匹配是正向匹配的,可以参考这个代码多理解。
    return 0;
}
//有效的下标应该在0~len-1范围内。len=str.size();


🎓题目—字符串最后一个单词的长度

#include <iostream>
using namespace std;

int main()
{
    string str1;
    // 不要使用cin>>line,因为会它遇到空格就结束了
    // while(cin>>line)
    while(getline(cin, str1))
    {
        size_t pos1=str1.rfind(' ');
        cout<<str1.size()-pos1-1<<endl;
    }
    return 0;
}

👉getline()

遇到这种情况我们用getline()这个非成员函数来进行操作

getline()函数读取一整行。


💻find_first_of()函数

int main()
{
	string str("Please, replace the vowels in this sentence by asterisks.");
	size_t found = str.find_first_of("abc");
	while (found != string::npos)
	{
		str[found] = '*';//找到abc字符那么就改成*
		found = str.find_first_of("abc", found + 1);
		//继续从found后面一个字符开始找abc任意一个
	}

	cout << str << '\n';

	return 0;
}


💻find_last_of()函数 

🎓find_first_of()和find_last_of() 

  • 1、find_first_of()函数
  • 正向查找在原字符串中第一个与指定字符串(或字符)中的某个字符匹配的字符,返回它的位置。若查找失败,则返回npos。(npos定义为保证大于任何有效下标的值。)
  • 2、find_last_of()函数
  • 逆向查找在原字符串中最后一个与指定字符串(或字符)中的某个字符匹配的字符,返回它的位置。若查找失败,则返回npos。(npos定义为保证大于任何有效下标的值。)
#include<iostream>
using namespace std;
int main()
{
    string str="abcdefab";
    cout<<str.find_first_of('a')<<endl;//第二个参数为0,默认从下标为0开始查找。
    cout<<str.find_first_of("hce")<<endl;//待查串hce第一个出现在原串str中的字符是c,返回str中c的下标2,故结果为2。
    cout<<str.find_first_of("ab",1)<<endl;//从下标为1开始查,待查串ab第一个出现在原串str中的字符是b,返回b的下标,结果为1。
    cout<<str.find_first_of('h')<<endl;//原串没有待查字符h,故查不到,返回npos。
    cout<<str.find_first_of("hw")<<endl;//待查子串任一字符在原串中都找不到,故查不到,返回npos。
    cout<<str.find_last_of("wab")<<endl;//原串最后一个字符首先与待查子串的每一个字符一一比较,一旦有相同的就输出原串该字符的下标.。结果为b的下标7。
    cout<<str.find_last_of("wab",5)<<endl;
    //从原串中下标为5开始逆向查找,首先f与待查子串每一字符比较,若有相同的就输出该字符在原串的下标。
    //若一个都没有,就依次逆向比较,即e再与待查子串一一比较,直到原串的b与待查子串中的b相同,然后输出该b在原串的下标1。
    cout<<str.find_last_of("fab",5)<<endl;//输出f在原串的下标5。
    cout<<str.find_last_of("fab",7)<<endl;//输出b在原串的下标7。
    cout<<str.find_last_of("hwk")<<endl;//原串没有待查子串的任何字符,故返回npos。
    return 0;
}
//有效的下标应该在0~len-1范围内。len=str.size();


 要相信别人能做出来自己一定可以做出来,只不过是时间没到而已

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

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

相关文章

Kubernetes 安全最佳实践:保护您的秘密

Kubernetes 是一个可用于微服务的开源容器编排平台。当我们想要部署容器化应用程序、自动化管理和扩展应用程序时&#xff0c;Kubernetes 非常有用。 在容器中运行单个微服务而不是在同一虚拟机中运行多个进程几乎总是更安全。每当我们在 Kubernetes 中启动任何 pod 时&#x…

「黄钊的AI日报·第二季」早鸟票,最后48小时~

每天5条AI内容点&#xff1a;不是新闻汇总&#xff0c;而是站在11年AI产品经理的视角&#xff0c;将原AI信息中的干货认知&#xff0c;提炼成我自己的文字、展示“what I see”。 做社群“AI产品经理大本营”6年以来&#xff0c;我都是在非常用心的输出AI干货&#xff1b;这份“…

vue3随机生成8位字母+数字

// 随机生成8位字母数字 export const autoPassword: any () > {// console.log("自动生成");//可获取的字符串const chars ABCDEFGHIJKLMNOPQRSTUVWSYZabcdefghijklmnopqrstuvwsyz0123456789;const list [];//通过随机获取八个字符串的索引下标for (let i 0;…

力扣11题 盛最多水的容器 双指针算法

11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明 你不能倾斜容器. 示…

【开源】基于Vue.js的超市账单管理系统的设计和实现

项目编号&#xff1a; S 032 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S032&#xff0c;文末获取源码。} 项目编号&#xff1a;S032&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3…

操作系统进程与线程篇

目录 一、进程 1.1、进程状态 1.2、进程的控制结构 1.3、进程的控制 1.4、进程的上下文切换 二、线程 2.1.线程是什么 2.2、线程与进程的比较 2.3、线程的上下文切换 2.4、线程的实现 2.5、轻量级线程 三、进程间的通信方式 3.1、管道 3.2、消息队列 3.3、共享内…

Linux--系统结构与操作系统

文章目录 冯诺依曼体系结构为什么要有内存&#xff1f;场景一 操作系统何为管理&#xff1f; 冯诺依曼体系结构 冯诺依曼体系结构是计算机体系结构的基本原理之一。它将程序和数据都以二进制形式存储&#xff0c;以相同的方式处理和存取。 上图是冯诺依曼体系结构的五大组成部…

Neo4j 数据库管理 数据备份与恢复(头歌)

文章目录 第1关&#xff1a;数据备份与恢复任务描述相关知识数据备份数据导入 编程要求测试说明答案测试前准备Cypher 代码数据备份与导入 第1关&#xff1a;数据备份与恢复 任务描述 本关任务&#xff1a;熟练掌握数据备份与恢复。 相关知识 为了完成本关任务&#xff0c;…

Jvm常见问题

1. 为什么用元空间替换永久代 避免OOM异常&#xff1a;永久代中存放了很多JVM需要的类信息&#xff0c;这些数据大多数是不会被清理的&#xff0c;所以Full GC往往无法回收多少空间。但在元空间模型中&#xff0c;由于字符串常量池已移至堆外&#xff0c;且元空间的大小不受JV…

Elasticsearch:使用 ILM 示例运行降采样 (downsampling)

如果你对降采样还不是很熟的话&#xff0c;请阅读之前的文章 “Elasticsearch&#xff1a;对时间序列数据流进行降采样&#xff08;downsampling)”。这是一个简化的示例&#xff0c;可让你快速了解降采样如何作为 ILM 策略的一部分来减少一组采样指标的存储大小。 该示例使用典…

LeetCode | 二叉树的最大深度

LeetCode | 二叉树的最大深度 OJ链接 这里需要注意的一点是每次有返回值&#xff0c;需要定义变量来保存上一次的值最后取最高的一方加1 int maxDepth(struct TreeNode* root) {if(root NULL)return NULL;int left maxDepth(root->left);int right maxDepth(root->r…

C语言中一些有关字符串的常见函数的使用及模拟实现(1)

在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了 ⼀系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 文章目录 strlen函数的使用及模拟实现strcmp函数的使用及模拟实现strcpy函数的使用及代…

《C++PrimerPlus》第9章 内存模型和名称空间

9.1 单独编译 Visual Studio中新建头文件和源代码 通过解决方案资源管理器&#xff0c;如图所示&#xff1a; 分成三部分的程序&#xff08;直角坐标转换为极坐标&#xff09; 头文件coordin.h #ifndef __COORDIN_H__ // 如果没有被定义过 #define __COORDIN_H__struct pola…

阅读文献总结2023

阅读文献基于卷积神经网络多源融合的网络安全态势感知模型 阅读文献 基于卷积神经网络多源融合的网络安全态势感知模型 题目基于卷积神经网络多源融合的网络安全态势感知模型文章信息&#xff1a;年份2023发文单位山西财经大学收录刊会计算机科学 &#xff08;北大核心&#…

和鲸科技与国科环宇建立战略合作伙伴关系,以软硬件一体化解决方案促进科技创新

近日&#xff0c;在国科环宇土星云算力服务器产品发布会暨合作伙伴年度会上&#xff0c;和鲸科技与国科环宇正式完成战略伙伴签约仪式&#xff0c;宣布达成战略合作伙伴关系。未来&#xff0c;双方将深化合作&#xff0c;充分发挥在产品和市场方面的互补优势&#xff0c;为企事…

el-table实现动态表头

1.1el-table渲染 <el-tableref"refreshTable":data"tableData"highlight-current-row><el-table-columnfixedwidth"170px"label"测点"align"center"prop"测站名称"/><el-table-column label"…

echarts实现3D柱状图

效果如图 let setData function(data, constData, showData) {data.filter(function(item) {if (item) {constData.push(1);showData.push(item);} else {constData.push(0);showData.push({value: 1,itemStyle: {normal: {borderColor: "rgba(0,0,0,0)",borderWidt…

中信建投在金融电于化期刊发布 DataOps 实践

文 ‖ 中信建投证券股份有限公司 马丽霞 高宇航 李可 许哲 李海伟 近年来&#xff0c;数据的分析和应用对各行各工业的业务模式和竞争形态进行重塑&#xff0c;而积极应对挑战和顺应时代变化是各个市场参与者的必选项。作为资本市场数字化转型的领航者&#xff0c;中信建投证券…

react-flip-move结合array-move实现前端列表置顶效果

你有没有遇到这样的需求&#xff1f;点击左侧列表项&#xff0c;则像聊天会话窗口一样将被点击的列表项置顶。 如果只是单纯的置顶的话&#xff0c;直接使用array-move就可以实现了&#xff0c;但置顶效果多少有点突兀~ 先上代码&#xff0c;直接使用array-move的情况&#xf…

11-30 SpringBoot2

热部署 开发过程中,修改代码,不需要重启,自动更新 项目上线,一定要关闭 SpringBoot热部署的实现&#xff1f;&#xff1f; ideal默认阻止class类更新 2&#xff0e;需要手动构建项目&#xff0c;可以使用快捷键激活此功能ctrl F9 / build project 自动构建项目 允许程序运行…