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

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

相关文章

如何优雅地让谷歌浏览器中的网页旋转90度?掌握这个技巧,让你的网页与众不同!

1、背景 网页旋转是一种视觉效果&#xff0c;可以让网页内容在不同的方向上展示&#xff0c;例如将横向的内容旋转为纵向展示&#xff0c;或将竖向的内容旋转为横向展示。这样可以使网页更加灵活多变&#xff0c;适应不同的场景需求。 需要网页旋转可能有以下几个原因&#x…

linux kernel 5.0 inline hook框架

github:https://github.com/WeiJiLab/kernel-hook-framework 一、项目介绍 Usually we want to hack a kernel function, to insert customized code before or after a certain kernel function been called, or to totally replace a function with new one. How can we…

Mysql常用命令

mysql连接&#xff1a; [roothost]# mysql -u root -p Enter password:******创建数据库&#xff1a; CREATE DATABASE 数据库名&#xff1b; 删除数据库&#xff1a; drop database 数据库名; 使用mysqladmin删除数据库&#xff1a; [roothost]# mysqladmin -u root -p dr…

尚融宝07-前端模块化

目录 一、模块化简介 1、背景 2、模块化解决的问题 3、模块化规范 二、ES6模块化规范 1、导出模块 3、测试 三、默认暴露模块 1、默认暴露 2、导入模块 3、测试 四、封装代码 1、创建app.js 2、引入入口文件 3、测试 一、模块化简介 1、背景 创建04-module-de…

2023年网络安全最应该看的书籍,弯道超车,拒绝看烂书

学习的方法有很多种&#xff0c;看书就是一种不错的方法&#xff0c;但为什么总有人说&#xff1a;“看书是学不会技术的”。 其实就是书籍没选对&#xff0c;看的书不好&#xff0c;你学不下去是很正常的。 一本好书其实不亚于一套好的视频教程&#xff0c;尤其是经典的好书…

【C++编译】gcc、gdb、make、cmake

编译器就是将计算机语言翻译为计算机能识别的语言。 文章目录1. gcc2. gdb3. make4. cmake1. gcc GCC(全称GNU Compiler Collection)&#xff1a;是一种多平台编译器&#xff0c;由GNU开发&#xff0c;最初用于编译C语言&#xff08;GNU C Compiler&#xff09;。 gcc可以将C…

论文阅读和分析:Mathematical formula recognition using graph grammar

Mathematical formula recognition using graph grammar 主要工作&#xff1a; 1、第一次实现Ofr(Optical Formula Recognition)系统&#xff0c;提取和识别数学表达式&#xff1b; 2、三个部分&#xff1a;OCR、构建图、解析图到语法树&#xff1b; 3、使用压缩子图成为一…

线程安全(重点)

文章目录一.线程安全的概念1.1 线程安全的概念1.2 线程不安全的原因1.3 解决线程不安全二.synchronized-monitor lock(监视器锁)2.1 synchronized的特性(1)互斥(2)刷新内存(3)可重入2.2 synchronied使用方法1.直接修饰普通方法:2.修饰静态方法:3.修饰代码块:三.死锁3.1死锁的情…

202304读书笔记|《不被定义的女孩》——做最真实最漂亮的自己,依心而行

202304读书笔记|《不被定义的女孩》——做最真实最漂亮的自己&#xff0c;依心而行《不被定义的女孩》作者ASEN&#xff0c;很棒的书。处处透露着洒脱&#xff0c;通透&#xff0c;悦己&#xff0c;阅世界的自由的氛围和态度&#xff01; 部分节选如下&#xff1a; 让自己活得…

2023秋招前端面试必会的面试题

判断数组的方式有哪些 通过Object.prototype.toString.call()做判断 Object.prototype.toString.call(obj).slice(8,-1) Array;通过原型链做判断 obj.__proto__ Array.prototype;通过ES6的Array.isArray()做判断 Array.isArrray(obj);通过instanceof做判断 obj instance…

多层多输入的CNN-LSTM时间序列回归预测(卷积神经网络-长短期记忆网络)——附代码

目录 摘要&#xff1a; 卷积神经网络(CNN)的介绍&#xff1a; 长短期记忆网络&#xff08;LSTM&#xff09;的介绍&#xff1a; CNN-LSTM&#xff1a; Matlab代码运行结果&#xff1a; 本文Matlab代码数据分享&#xff1a; 摘要&#xff1a; 本文使用CNN-LSTM混合神经网…

STM32开发(九)STM32F103 通信 —— I2C通信编程详解

文章目录一、基础知识点二、开发环境三、STM32CubeMX相关配置四、Vscode代码讲解GPIO模拟I2C代码SHT30相关代码main函数中循环代码五、结果演示方式一、示波器分析I2C数据方式2、通过Modbus将获取到的数据传到PC上一、基础知识点 本实验通过I2C通信获取SHT30温湿度值&#xff…

springcloud3 nacos,sentinel,ribbon,openfegin等整合案例4[fallback+blockhandler完美整合]

一 说明 1.1 结论 SentinelResource(value "fb",fallback "handlerFallback") //fallback只负责业务异常 SentinelResource(value "fb",blockHandler "blockHandler") //blockHandler只负责sentinel控制台配置违规 假设fallbac…

基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)

摘要&#xff1a;农作物叶片病害检测系统用于智能检测常见农作物叶片病害情况&#xff0c;自动化标注、记录和保存病害位置和类型&#xff0c;辅助作物病害防治以增加产值。本文详细介绍基于YOLOv5深度学习模型的农作物叶片病害检测系统&#xff0c;在介绍算法原理的同时&#…

门面设计模式

介绍 Java门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个简单的接口,隐藏了复杂系统的实现细节,使得客户端可以更加容易地使用系统. 在Java门面模式中,一个门面对象(Facade)提供了一个简单的接口,该接口包装了一个或多个复杂的子系统,客户端可以直接使用门面对象…

C#等高级语言运行过程

C#等高级语言运行流程&#xff1a;假设您编写了一个 C# 程序并将其保存在一个称为源代码的文件中。特定于语言的编译器将源代码编译成 MSIL&#xff08;Microsoft 中间语言&#xff09;&#xff0c;也称为 CIL&#xff08;通用中间语言&#xff09;或 IL&#xff08;中间语言&a…

近期投简历、找日常实习的一些碎碎念(大二---测试岗)

嘿嘿嘿&#xff0c;我又回来了&#xff0c;相信不少兄弟已经发现我似乎已经断更了好久&#xff0c;哈哈&#xff0c;我是尝试去找实习&#xff0c;投简历面试去了。 先说一下背景。 目录 背景 求职进行中 简历 投递和沟通 收获和感受 背景 博主&#xff0c;大二软件工程…

uboot主目录下Makefile文件的分析,以及配置过程分析

主Makefile执行分析 uboot的编译过程 &#xff08;1&#xff09;配置 查看主Makefile文件下所支持的配置的板子&#xff0c;通过make x210_sd_config来实现编译前的配置 &#xff08;2&#xff09;编译 make直接编译&#xff0c;这个前提条件是主Makefile文件下指定了编译…

【动态规划】最长上升子序列(单调队列、贪心优化)

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

指针进阶(上)

内容小复习&#x1f431;&#xff1a; 字符指针:存放字符的数组 char arr1[10]; 整型数组:存放整型的数组 int arr2[5]; 指针数组:存放的是指针的数组 存放字符指针的数组(字符指针数组) char* arr3[5]; 存放整型指针的数组(整型指针数组) int* arr[6]; 下面进入学习了哦~&…
最新文章