当前位置: 首页 > article >正文

string类(下)

string类(下)

  • 1.string类对象的访问及遍历操作
    • 1.1operator[ ]
    • 1.2begin+end
    • 1.3rbegin+rend
    • 1.4C++范围for
  • 2.string类对象的修改操作
    • 2.1push_back
    • 2.2append
    • 2.3operator+=
    • 2.4c_str
    • 2.5find
    • 2.6rfind
    • 2.7substr
    • 2.8insert
    • 2.9erase
    • 2.10replace
  • 3.string类非成员函数
    • 3.1operator+
    • 3.2operator>>
    • 3.3operator<<
    • 3.4getline
  • 4.vs和g++string结构的说明

🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【C++的学习】
📝📝本篇内容:string类对象的访问及遍历操作;string类对象的修改操作;string类非成员函数;vs和g++string结构的说明
⬆⬆⬆⬆上一篇:string类(上)
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-

1.string类对象的访问及遍历操作

1.1operator[ ]

返回pos位置的字符

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	for (int i = 0; i < s.size();i++)
	{
		cout << s[i] <<" ";
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	for (int i = 0; i < s.size();i++)
	{
		s[i]='a';
		cout << s[i] <<" ";
	}
	return 0;
}

在这里插入图片描述
可以看到这是个函数重载,也支持const对象

1.2begin+end

begin获取一个字符的的迭代器+end获取最后一个字符下一个位置的迭代器
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	string s("hello world");
	string::iterator b = s.begin();
	string::iterator e = s.end();
	while (b != e)
	{
		cout << *b << " ";
		b++;
	}
	cout << endl;
	return 0;
}

可以暂时把它当做一个指针一样使用
其中还可以发现它也是一个函数重载,支持const,这样的话就没法修改字符串对象的有效字符了
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	const string s("hello world");
	 string:: const_iterator b = s.begin();
	 string:: const_iterator e = s.end();
	while (b != e)
	{
		cout << *b << " ";
		b++;
	}
	cout << endl;
	return 0;
}

1.3rbegin+rend

反向迭代
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	const string s("hello world");
	 string:: const_reverse_iterator b = s.rbegin();
	 string:: const_reverse_iterator e = s.rend();
	while (b != e)
	{
		cout << *b << " ";
		b++;
	}
	cout << endl;
	return 0;
}

1.4C++范围for

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include <string>
#include<iostream>
using namespace std;
int main()
{
	const string s("hello world");
	for (auto i : s)
	{
		cout << i << endl;

	}
	return 0;
}

他的底层实现本质就是迭代器

2.string类对象的修改操作

2.1push_back

在字符串后面尾插字符c
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		s.push_back('c');
		cout << s << endl;
		return 0;
	}

2.2append

在字符串后面追加一个字符串
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		s.append("11111");
		cout << s << endl;
		return 0;
	}

2.3operator+=

在字符串后面追加字符串或者字符
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		s +="12345";
		s +='c';
		cout << s << endl;
		return 0;
	}

2.4c_str

返回C格式字符串
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		s += '\0';
		s += "1111111";
		cout << s.c_str() << endl;
		cout << s << endl;
		return 0;
	}

为什么要存在c_str?因为它与直接打印的cout不同,c_str遇到’\0’会停下

2.5find

从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		size_t pos=s.find('w');
		cout <<s[pos] << endl;;
		return 0;
	}

2.6rfind

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		size_t pos=s.rfind('w');
		cout <<s[pos] << endl;;
		return 0;
	}

2.7substr

在str中从pos位置开始,截取n个字符,然后将其返回
在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		cout << s.substr(6, 5) << endl;
		return 0;
	}

2.8insert

在字符串中由pos指示的字符前插入附加字符
在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		s.insert(0,"1111");
		s.insert(1,1,'c');
		cout << s << endl;
		return 0;
	}

2.9erase

擦除字符串的一部分
在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		s.erase(5,6);
		cout << s << endl;
		return 0;
	}

2.10replace

用新内容替换字符串中字符pos开始并跨越len个字符的部分
在这里插入图片描述

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		s.replace(5,1,"1111");
		cout << s << endl;
		return 0;
	}

注意:
①一般情况下string类的+=操作符用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串
②对string操作时,如果能够大概预估防多少字符,可以先通过reserve把空间预留好

3.string类非成员函数

3.1operator+

尽量少用,因为传值返回,导致深拷贝效率低
在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		cout << s +"1111" << endl;
		return 0;
	}

3.2operator>>

输入运算符在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		char c;
		cin >> s;
		cout << s << endl;
		
		return 0;
	}

3.3operator<<

这个就是常用的输出运算符
在这里插入图片描述

3.4getline

获取一行字符串
在这里插入图片描述
在这里插入图片描述
包含空格,直到‘\n’停止

4.vs和g++string结构的说明

在32位下,string总共占28个字节,先是一个联合体用来定string字符串的存储空间:当字符串长度小于16时,使用内部固定的字符数组来存放
当字符串长度大于等于16时,从堆上开辟空间
当string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高
其次:还有一个size_t字段保存字符串长度,一个capacity字段保存开辟空间的总容量
最后:还有一个指针做一些其他事情
故总共占16+4+4+4+4=28字节
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
	#include <string>
	#include<iostream>
	using namespace std;
	int main()
	{
		string s("hello world");
		cout<<sizeof(s)<<endl;
		return 0;
	}

在这里插入图片描述
g++下string的结构
g++下,string是通过写时拷贝实现的,string对象总共占4字节,内部包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:空间大小,字符串有效长度,引用计数
引用计数:用来记录资源使用者的个数。在构造时,将资源的计数给成1,每增加一个对象使用该资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;否则就不能释放,因为还有其他对象在使用该资源。

🌸🌸string类(下)的知识大概就讲到这里啦,博主后续会继续更新更多C++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪


http://www.kler.cn/a/1580.html

相关文章:

  • ios脚本巨魔商店多巴胺越狱基本操作教程
  • oracle闪回恢复数据:(闪回查询,闪回表,闪回库,回收站恢复)
  • 【计算机网络】常见交换机名词术语
  • (六)CAN总线通讯
  • 【Cesium】自定义材质,添加带有方向的滚动路线
  • 【cuda学习日记】2.cuda编程模型
  • 如何优雅地让谷歌浏览器中的网页旋转90度?掌握这个技巧,让你的网页与众不同!
  • linux kernel 5.0 inline hook框架
  • Mysql常用命令
  • 尚融宝07-前端模块化
  • 2023年网络安全最应该看的书籍,弯道超车,拒绝看烂书
  • 【C++编译】gcc、gdb、make、cmake
  • 论文阅读和分析:Mathematical formula recognition using graph grammar
  • 线程安全(重点)
  • 202304读书笔记|《不被定义的女孩》——做最真实最漂亮的自己,依心而行
  • 2023秋招前端面试必会的面试题
  • 多层多输入的CNN-LSTM时间序列回归预测(卷积神经网络-长短期记忆网络)——附代码
  • STM32开发(九)STM32F103 通信 —— I2C通信编程详解
  • springcloud3 nacos,sentinel,ribbon,openfegin等整合案例4[fallback+blockhandler完美整合]
  • 基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)
  • 门面设计模式
  • C#等高级语言运行过程
  • CSDN周赛第37期题解(Python版)
  • 近期投简历、找日常实习的一些碎碎念(大二---测试岗)
  • uboot主目录下Makefile文件的分析,以及配置过程分析
  • 【动态规划】最长上升子序列(单调队列、贪心优化)