stl之string

 构造函数

void test1()
{
	string s1;//不传参
	cout << s1 << endl;
	string s2("123456");
	cout << s2 << endl;
	string s3(s2);
	cout << s3 << endl;
	string s4(s2, 1, 5);
	cout << s4 << endl;
	string s5("123456", 2);
	cout << s5 << endl;
	string s6(8, 'c');
	cout << s6 << endl;
}
int main()
{
	test1();
	return 0;
}

第三种情况最后一个是缺省值,如果没有传第三个参数默认从pos位置开始一直复制到最后

赋值

void test3()
{
	string s1="hello";
const string& s2="world";//隐式类型转换
}

size和capacity

void test2()
{
	string s1("111111");
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
	cout << s1.max_size() << endl;
}
int main()
{
	test2();
	return 0;
}

 max_size没什么用,实际上也不会扩容到这么多空间,其实length在这里和size的用、作用是一致的,但length只能用于stl的部分容器,所以我们之后统一用size

[ ]运算符

我们可以直接使用下标来访问

	for (int i = 0; i < s1.size(); i++)
	{
		//cout << s1.operator[](i) << " " ;
		cout << s1[i] << " ";
	}

 两者是等价的

迭代器:iterator

begin:任何容器返回第一个数据位置的iterator

end:任何数据返回最后数据的下一个位置的iterator

 迭代器第二种情况是当string的对象是常量时,迭代器指向的数据不能写(但迭代器是可以修改的)

遍历string:

void test4()
{
	string s1("hello world");
	//遍历方式1,下标
	for (int i = 0; i < s1.size(); i++)
	{
		cout << s1[i];
	}
	cout << endl;
	//遍历方式2,迭代器
	//string::iterator j = s1.begin();
	auto j = s1.begin();
	while (j != s1.end())
	{
		//(*j) += 3;可以修改值
		cout << *j ;
		j++;
	}
	cout << endl;
	//遍历方式3,范围for,底层来看,还是迭代器
	for (auto e : s1)
	{
		cout << e;
	}
	cout << endl;
}

 const修饰后的遍历

void test5()
{
	const string s1("hello world");
	string::const_iterator j = s1.begin();
	//auto j = s1.begin();
	while (j < s1.end())
	{
		cout << *j;
		j++;
	}
	cout << endl;
}

 rbegin和rend

本质上和begin和end相同,但是是逆置后的,用法也相似

void test6()
{
	string s1("hello world");
	string::reverse_iterator j = s1.rbegin();
	while (j != s1.rend())
	{
		cout << *j;
		j++;
	}
}

排序

按字典序排序

void test7()
{
	string s1("hello world");
	sort(s1.begin(), s1.end());//对对应的位置排序
	cout << s1;
}

 +=

类似于c语言中的strcat,但这里就不用考虑s1能不能存的下的问题了

void test8()
{
	string s1("11111");
	string s2("22222");
	s1 += s2;
	cout << s1;
}

 append:

这里结构和之前的构造是一致的,功能是进行尾插一段字符串 

insert:

void test9()
{
	string s1("tired");
string s2("222222");
//单个字符
	char sh = 'x';
	s1.insert(s1.begin(), sh);
	cout << s1 << endl;	
//迭代器实现
s2.insert(s2.begin(), s1.begin(), s1.end());
	cout << s2 << endl;
}

insert的处理起来时间复杂度是O(N),实际上也很少用这个函数

void test10()
{
	string s1("hello world");
	//s1.erase(1,2);
	s1.erase(s1.begin(), s1.end());
		cout << s1 << endl;
}

erase: 

 erase效率和insert差不多,一种迭代器实现,一种是从pos位置开始删除len长度个字符

resize: 

reserve: 

void test12()
{
	string s1("hello world");
	//提前开好空间
	s1.reserve(63);
	cout << s1.capacity() << endl;
	s1.resize(20,'x');
	cout << s1.capacity() << endl;
}
resize的n比capacity大时,capacity也会自动扩容,如果第二个参数是字符,会自动补充,如果没有,会补充空字符

c_str() 

void test13()
{
	//c_str兼容c
	 string file("test.cpp");
FILE* out = fopen(file.c_str(), "r");
char ch= fgetc(out);
while (ch != fgetc(out))
{
	cout << ch;
	ch = fgetc(out);
}

 因为C++兼容C,所以进行读写文件的时候有c_str这个函数

 

find和rfind 

 

简单来说,find是从前往后找到第一次发现的字符,rfind是从后往前找 

find_first_of,find_last_of

 

 与find和last相比,这两个是找一个字符串中任意一个字符匹配的位置,第一个是从前往后找,第二个是从后往前找

 如下一段代码,windows和linux下都能查找对应代码路径和文件

	void SplitFilename(const string& str)
	{
		cout << "Splitting: " << str << '\n';
		size_t found = str.find_last_of("/\\");
		cout << " path: " << str.substr(0, found) << '\n';
		cout << " file: " << str.substr(found + 1) << '\n';
	}
	int main()
	{
		std::string str1("/usr/bin/man");
		std::string str2("c:\\windows\\winhelp.exe");
		SplitFilename(str1);
		SplitFilename(str2);
		return 0;
	}

substr:截取一段子串

getline 

可以具有cin的功能,但是有cin遇到空格就不再提取,而getline是遇到换行不再提取,也可以指定特殊字符 

to_string:将自定义类型转换为string类型 

 

string的capacity扩容

vs上是1.5倍扩容,capacity比实际空间少一个,有一个多的是预留给'\0'的

当字符串长度小于16时,使用内部固定的字符数组来存放 当字符串长度大于等于16时,从堆上开辟空间

	void test17()
	{
		string s;
	size_t sz = s.capacity();
		cout << "initial capacity " << sz << endl;
		for (int i = 0; i < 100; i++)
		{
			s.push_back('c');
			if (sz != s.capacity())
			{
				sz = s.capacity();
				cout << "capacity changed: " << sz<<endl;
			}
		}
	}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP 网络通信底层原理分析

大家好&#xff0c;我是码农先森。 引言 我们日常的程序开发大多数都是以业务为主&#xff0c;很少会接触到底层逻辑。对于我们程序员来说&#xff0c;了解程序的底层运行逻辑&#xff0c;更有助于提升我们对程序的理解。我相信大多数的人&#xff0c;每天基本上都是完成业务…

丝杆支撑座:滚珠丝杆稳定运行的守护者!

丝杆支撑座是丝杆和电机之间连接的重要组成部分&#xff0c;发挥着非常重要的功能。提到丝杆支撑座和滚珠丝杆&#xff0c;很多人都会想到支撑关系&#xff0c;但丝杆支撑座作为滚珠丝杆系统中至关重要的角色&#xff0c;其作用远不止于简单的支撑。 丝杆支撑座安装过程非常简单…

第30课 绘制原理图——放置网络标签

什么是网络标签&#xff1f; 我们在很多电路图中都能看到&#xff0c;为了让图纸更加简洁&#xff0c;并不是每一根导线都要确确实实地画出来。可以在导线悬空的一端添加一个名称标签&#xff0c;接着在另一根导线的悬空一端添加上一个同名的名称标签&#xff0c;那么就可以让…

【自监督-MIM】系列方法学习二

Masked image modeling 是一种训练深度学习模型的技术,尤其是在视觉领域,类似于自然语言处理中的掩码语言建模(Masked Language Modeling)。它通过在输入图像中随机遮挡(或称为掩码)部分区域,然后训练模型来预测这些被遮挡部分的内容,从而提高模型的视觉理解能力。 Ma…

IDEA无法输入中文,怎么破

1.导航栏处&#xff0c;点击help菜单&#xff0c;选择Edit Custom VM Options.. 2.编辑文件&#xff0c;在文件末尾添加&#xff1a; -Drecreate.x11.input.methodtrue 3.保存文件即可&#xff0c;如果还是不行&#xff0c;就关闭所有Idea程序&#xff0c;重新启动Idea

机器学习之集成学习

一&#xff1a;概念 顾名思义集成学习就是用多个其他的算法结合起来使用 对于“其他算法”有同类和同质的区别&#xff0c;同质指的是所用的算法都是同一类型的&#xff0c;比如决策树和神经网络&#xff0c;这种也叫基学习器。反之亦然&#xff0c;但一般使用的是同质的。 …

网络治理新模式:Web3时代的社会价值重构

随着Web3技术的崛起&#xff0c;传统的网络治理模式正在经历革新&#xff0c;这不仅仅是技术的进步&#xff0c;更是对社会价值观念的挑战和重构。本文将深入探讨Web3时代的网络治理新模式&#xff0c;其背后的技术基础、社会影响以及未来的发展方向。 1. 引言 Web3时代&#…

文件进行周期性备份后权限更改的解决方案--使用脚本和定时任务

这里写目录标题 背景现象解决方案原因分析面临的问题解决思路操作步骤每个文件夹权限分配表测试chmod和chown两个命令是否可行写脚本实现定时同步同时修改权限 异地同步改权限在NAS上生成SSH密钥对将NAS的公钥复制到Linux服务器在NAS上编写同步脚本在NAS上执行脚本&#xff0c;…

咖啡机器人如何实现定量出水?

咖啡机器人实现定量出水的关键在于流量控制系统的设计&#xff0c;其中霍尔式流量计和光电式流量计是常用的测量设备。这两种流量计均具有精确高、一致性强、多种高低流量控制等特点&#xff0c;能够满足咖啡机器人定量出水的需求。 对于霍尔式流量计&#xff0c;其利用霍尔效…

防近视台灯有效果吗?专业护眼台灯推荐!告诉你台灯怎么选

随着学业负担的加重和电子设备的广泛普及&#xff0c;近视问题在青少年群体中愈发凸显&#xff0c;近视率持续走高。导致近视的因素错综复杂&#xff0c;除了过度使用手机外&#xff0c;遗传因素、不良的用眼习惯、环境因素、营养不均衡以及学习压力等均为重要因素&#xff0c;…

【深海王国】小学生都能玩的语音模块?ASRPRO打造你的第一个智能语音助手(1)

Hi~ (o^^o)♪, 各位深海王国的同志们&#xff0c;早上下午晚上凌晨好呀~ 辛勤工作的你今天也辛苦啦(/≧ω) 今天大都督将为大家带来全新系列——小学生都能玩的语音模块&#xff0c;帮你一周内快速学会语音模块的使用方式&#xff0c;打造一个可用于智能家居、物联网领域的语音…

【SpringBoot3.x】自定义开发通用SDK

1. 前言 相信大家学习SpringBoot到现在&#xff0c;使用Maven构建项目时&#xff0c;会在pom.xml文件中引入各种各样的依赖&#xff0c;那么我们如何将自己常用的一些工具类库进行封装成starter或者SDK供其他项目使用呢&#xff0c;本博客就会带着大家一步一步创建自定义的SDK…

使用 MyFlash 实现 MySQL 数据闪回

文章目录 简介GithubMyFlash 限制MySQL 准备开启 binlogmysqlbinlog 安装 MyFlashflashback 选项生成回滚文件执行回滚操作操作示例 简介 MySQL中的Binlog&#xff08;Binary Log&#xff09;数据闪回&#xff0c;也称为Point-in-Time Recovery (PITR)&#xff0c;是一种强大的…

Ansible-综合练习-生产案例

斌的招儿 网上教程大多都是官网模板化的教程和文档&#xff0c;这里小斌用自己实际生产环境使用的例子给大家做一个详解。涉及到一整套ansible的使用&#xff0c;对于roles的使用&#xff0c;也仅涉及到tasks和files目录&#xff0c;方便大家快速上手并规范化管理。 0.环境配置…

私接路由器导致部分终端(电脑、手机等)无法上网问题分析

目录 【1】私接路由器场景 【2】进行网络基本配置&#xff0c;模拟终端可以正常上网 【2.1】Http-Server配置 【2.2】ISP配置 【2.3】R-hefa配置 【2.4】Client1配置 【2.5】PC配置 【2.6】测试验证上网是否正常 【3】私接路由器后再测试验证公司内网各终端访问外网是…

大模型AI技术实现语言规范练习

人工智能技术可以为语言规范练习提供多种有效的解决方案&#xff0c;帮助学习者更有效地掌握语言规范。以下是一些常见的应用场景。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 智能纠错 利用自然语言处理技术&#xff0c;可以…

代码随想录-Day42

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…

定制型汽车传感器在汽车中的应用

定制型汽车霍尔传感器在汽车中的应用及功能 曲轴和凸轮轴位置传感器&#xff1a; 这些传感器用于监测发动机的曲轴和凸轮轴的位置&#xff0c;帮助发动机管理系统精确控制点火时机和燃油喷射&#xff0c;提高发动机效率。 变速器控制系统&#xff1a; 在自动变速器中&#xf…

通达信短线抄底主升浪幅图指标公式源码

通达信短线抄底主升浪幅图指标公式源码&#xff1a; A1:REF(C,1); A2:SMA(MAX(C-A1,0),5,1)/SMA(ABS(C-A1),5,1)*1000; A3:BARSLAST(REF(CROSS("RSI.RSI1"(6,12,24),"RSI.RSI2"(6,12,24)),1)); A4:A2-LLV(A2,10); A5:(MA(A4,2)*3A4*13)/16; A6:IF(A5>1…

PTE-靶场训练-1

PTE-靶场训练实战笔记 靶场搭建 靶场下载链接&#xff1a; https://pan.baidu.com/s/1ce1Kk0hSYlxrUoRTnNsiKA?pwdha1x vim /etc/sysconfig/network-scripts/ifcfg-eth0 设置好后reboot重启一下即可&#xff0c;然后访问81-85端口&#xff0c;共5题。 因为靶场出了问题&a…