【C++】string|迭代器iterator|getline|find

news2024/11/19 1:18:55

目录

​编辑

string

1.string与char* 的区别 

2.string的使用

字符串遍历

利用迭代器遍历 

范围for遍历 

反向迭代器 

字符串capacity 

字符串插入操作 

 push_back函数

append函数 

 +=运算符

​编辑

 insert函数

substr函数 

字符串查找函数 

find函数

 rfind函数

​编辑

 查找函数的使用

 getline函数


 

string

C++中的string类是字符串类

string类本质上就是一个可以管理动态增长的字符数组的类,并且这个字符数组以 ‘\0’ 结尾;

string类底层已经将增、删、查、改以及扩容这些机制封装好了,我们只需要直接使用即可;

头文件: #include<string>

 

1.string与char* 的区别 

 char*是一个指针;
string是一个,类内部封装了char*,管理这个字符串,是一个char*型的容器

2.string的使用

string构造函数7个

注:第三个构造函数中,npos size_t (无符号整形)类型的-1,这个数是极大的数(根据不同编译器可能有所差异);

这个构造函数的意思是:从字符串strpos位置开始,拷贝len个字符,如果str太短或len= npos(缺省),则从pos位置拷贝构造到str的末尾

 

int main()
{
	string s0;
	string s1("hello world");	
	string s2(s1);
	string s3(s1, 5, 3);	//拷贝s1的第五个位置往后的三个
	string s4(s1, 5, 10);
	string s5(s1, 5);

	cout << s0 << endl; //无
	cout << s1 << endl;		//hello world
	cout << s2 << endl;		//hello world
	cout << s3 << endl;		// wo
	cout << s4 << endl;		// world
	cout << s5 << endl;		// world
	 
	string s6(10,'#');
	cout << s6 << endl;

	return 0;
}

字符串遍历

 []+下标遍历;

:这里的调用,实际上是用了运算符重载 operator[]不是数组的形式

                                                                                        a[i] = *(a+i)

void test_string1()
{
		string s("hello world");
		for (size_t i = 0; i < s.size(); i++)
		{
			cout << s[i];	//注意这里 实际是 s.operator[](i)   并非数组  a[i] = *(a+i)
		}
		cout << endl;
}

利用迭代器遍历 

 迭代器基本上每个容器都有,string::iterator  表明是string域的;

begin()函数返回的是string字符串的首位置

end会在字符串最后一个有效位置的下一个位置;

begin~end = 左闭右开

 


	//迭代器遍历
			string s("hello world");
			string::iterator it = s.begin();	
			while (it != s.end())	//end 和在字符串的最后一个有效符号的下一个位置
			{
				cout << *it;
				++it;
			}
			cout << endl;

范围for遍历 

范围for:是c++提供的一个非常方便的访问方式。

可以自动取对象的内容并且自动向后访问自动停止

范围for的底层实现其实是迭代器,我们还可以利用auto关键字来配合使用范围for

	//范围for
	string s("hello world");
	for (auto ch : s)
	{
		cout << ch;
	}
	cout << endl;

反向迭代器 

使用begin()函数和end()函数的迭代器遍历是正向迭代器

反向迭代器顾名思义,就是顺序反过来了,它的用法与正向迭代器非常类似。

使用前先介绍rbegin()rend()这两个函数,这两个函数是用来配合反向迭代器使用的rbegin() : 函数返回的是string字符串的最后一个有效字符

rend() :函数返回的是string字符串的第一个字符的前一个位置。 

 

	//反向迭代器
	string s("hello world");
	string::reverse_iterator rit = s.rbegin();
	while (rit != s.rend())
	{
		cout << *rit;
		rit++;// 反向迭代器也是++
	}
	cout << endl;

字符串capacity 

string - C++ Reference (cplusplus.com)

void test_string_capacity()
{
	//支持cout cin进行输入输出
	string s("hello world");
	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

	cout << endl;
	//将s的字符串清空,只是size清0,不会改变容量大小
	s.clear();
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << endl;

	//将s中有效字符个数增加到15,多出的位置用a填充
	s.resize(15,'a');
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;
	
	cout << endl;
	//将s中有效字符缩小到5个,
	s.resize(5);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;
}

字符串插入操作 

 push_back函数

push_back函数可以实现string对象的插入操作,但是需要注意的是push_back函数只能够尾插入一个字符不能插入字符串

 

append函数 

可以插入字符串,可以插入另一个string对象,而且可以指定n个字符插入

string::append - C++ Reference (cplusplus.com)

	//append
		string s("hello");
		s.append("-world");// 插入常量字符串
		cout << s << endl;
		string str("world");
		s.append(str);// 插入另一个string对象
		cout << s << endl;

 

 +=运算符

不仅可以插入新的string对象,还可以插入常量字符串,也可以插入单个字符

string::operator+= - C++ Reference (cplusplus.com)

	//+=
		string s("hello ");
		s += "-world"; // 插入常量字符串
		cout << s << endl;
		string str("world");
		s += str; // 插入新的string对象
		cout << s << endl;

		s += 'A';// 插入单个字符
		cout << s << endl;

 insert函数

insert 函数可以在任意的指定位置进行插入insert 函数它可以在任意的指定位置插入一个新的string对象、一个常量字符串、一个常量字符串的n个字符、一个字符等等。

string::insert - C++ Reference (cplusplus.com)

 

	//insert
		string s("hello");

		// 在下标为0的位置插入一个新的string对象
		string str("C++");
		s.insert(0, str);
		cout << s << endl; //C++hello

		// 在下标为0的位置插入一个常量字符串
		s.insert(0, "hello world");
		cout << s << endl;

		// 在下标为0的位置插入一个常量字符串的前3个字符
		s.insert(0, "he-lo world", 3);
		cout << s << endl; //he-hello worldC++hello

		// 在下标为0的位置插入一个字符x
		s.insert(0, 1, 'x');
		s.insert(s.begin(), 'x');
		cout << s << endl; //xxhe-hello worldC++hello

		// 在下标为0的位置插入三个字符x
		s.insert(0, 3, 'x');
		cout << s << endl; //xxxxxhe-hello worldC++hello

substr函数 

substr函数是用来返回string字符串的一个任意子串,我们可以通过设定起始位置pos和子串长度len来获取子串;

string::substr - C++ Reference (cplusplus.com)

	//substr
	string s1("hello world");
		   //  012345678910 '\0'
	// 取出子串"world"
	string s2 = s1.substr(6, 5);	//第6个位置往后的五个字符
	cout << s2 << endl; //world

字符串查找函数 

find函数

find函数:可以查找string对象、常量字符串或者是一个字符,并且可以设定pos值来规定查找的起始位置,默认从0下标开始查找。

例题:

URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符

class Solution {
public:
    string replaceSpaces(string S, int length) {
        size_t pos = S.find(' ');    //find找空格,记录位置pos值
        while(pos != string::npos)    //一直找到字符串结束
        {
            S.replace(pos,1,"%20");    //找到了就替换
            pos = S.find(' ');    //找下一个空格
        }
        return S;
    }
};

 rfind函数

find函数是顺着查找,而rfind倒着查找

find函数和rfind函数的区别就是查找方向不同

 查找函数的使用

URL进行分割。

URL = 协议、域名和uri

void test_string_find()
{
	
		string url("https://legacy.cplusplus.com/reference/string/string/rfind/");
		cout << url << endl;

		// 提取协议
		string protocol;
		size_t pos1 = url.find("://");
		// 查找成功
		if (pos1 != string::npos)
		{
			protocol = url.substr(0, pos1);
			cout << "协议:" << protocol << endl;
		}
		else
		{
			cout << "非法url" << endl;
		}

		// 提取域名
		string domainName;
		size_t pos2 = url.find('/', pos1 + 3);
		// 查找成功
		if (pos2 != string::npos)
		{
			domainName = url.substr(pos1 + 3, pos2 - (pos1 + 3));
			cout << "域名:" << domainName << endl;
		}
		else
		{
			cout << "非法url" << endl;
		}

		// 提取uri
		string uri = url.substr(pos2);
		cout << "uri:" << uri << endl;
}

 getline函数

cinstring进行流提取时,由于cin遇到空格和换行停止读取.

所以我们如果想要读取带有空格的字符串就会出现读取不完整的现象。

此时就需要用到getline函数,getline函数可以获取一行字符串,遇到换行符才会停止读取,遇到空格不会停止

getline (string) - C++ Reference (cplusplus.com)

  

	getline(cin, s);
	cout << s << endl;

 

 

 

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

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

相关文章

果蔬经营平台|基于SSM+vue的果蔬经营平台系统的设计与实现(源码+数据库+文档)

果蔬经营平台系统 目录 基于SSM&#xff0b;vue的果蔬经营平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介…

过滤器Filter和拦截器Interceptor实现登录校验

一.过滤器 Filter过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些登录验证的功能 1.Filter的快速入门 1.定义Filter:定义一个类&#xff0c;实现Filter接口&#xff0c;并重写其所有方法。2.配置 public class dofilter implements Filter {Override //初始化只…

IT技术产品:开发者极为重要的思维习惯

1、特色内容预告 1、我用敏捷开发思维&#xff0c;提高工作效率。 2、我用代码批判思维&#xff0c;逐渐让自己的作品变得无可挑剔。 3、我是一个顶级程序员&#xff0c;是哪些重要的专业习惯&#xff0c;让我如此优秀&#xff1f; 2、可以免费获取到的IT资源 1、《软件工程&a…

深度学习入门到放弃系列 - 阿里云人工智能平台PAI部署开源大模型chatglm3

通过深度学习入门到放弃系列 - 魔搭社区完成开源大模型部署调用 &#xff0c;大概掌握了开源模型的部署调用&#xff0c;但是魔搭社区有一个弊端&#xff0c;关闭实例后数据基本上就丢了&#xff0c;本地的电脑无法满足大模型的配置&#xff0c;就需要去租用一些高性价比的GPU机…

地平线X3开发板Intel Realsense深度相机调试记录

1. 预编译包 编译这个SDK花费了5.6个小时&#xff0c;为了方便各位后续使用&#xff0c; 各位可以直接下载编译好的文件&#xff0c;包含C和Python的库&#xff0c;相关文件已经上传至百度云&#xff08;提取码&#xff1a;awe4 &#xff09;。 在提供的这些文件中&#xf…

【教程】Linux/Jetson 安装X11VNC同步屏幕内容

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 目录 背景说明 实际效果 安装步骤 安装 x11vnc 配置 x11vnc 配置 x11vnc 作为系统服务 使用 VNC 客户端连接 背景说明 通常vnc-server是单…

基于Java的俄罗斯方块游戏的设计与实现

关于俄罗斯方块项目源码.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89300281 基于Java的俄罗斯方块游戏的设计与实现 摘 要 俄罗斯方块是一款风靡全球&#xff0c;从一开始到现在都一直经久不衰的电脑、手机、掌上游戏机产品&#xff0c;是一款游戏规则简单…

[MRCTF2020]PixelShooter

是个安卓游戏题 re手肯定不会去玩游戏&#xff0c;先jadx分析一波 没有什么关键信息&#xff0c;但找到了一个unity类&#xff0c;想到apk也可以解压缩得到 .so 或者 Assembly-CSharp.dll 故又在dnspy分析一下 看了半天没有和flag有关信息&#xff0c;看wp&#xff1a; Asse…

用友网络的危与机:2023年亏损约10亿元,王文京面临严肃拷问

“企业在新的产业浪潮来临时&#xff0c;应该主动推进新阶段的产品和业务创新&#xff0c;这样才能够在新的浪潮成为主流的时候&#xff0c;走到行业前面&#xff0c;否则就会从产业发展的潮流中掉下来”。用友网络创始人王文京&#xff0c;曾用“冲浪理论”形容一家企业成功的…

单区域OSPF实验

实验目的&#xff1a; 理解OSPF的基本概念。掌握单曲于OSPF的配置掌握OSPF邻居状态的解读掌握通过Cost控制OSPF选路的方法掌握OSPF认证的配置方法 一、基础配置&#xff1a; 搭建实验拓扑图&#xff1b; 配置路由器接口的IP地址以及配置环回地址待后续使用 &#xff08;1&a…

ICode国际青少年编程竞赛- Python-6级训练场-多重递归

ICode国际青少年编程竞赛- Python-6级训练场-多重递归 1、 def move(a, b):if a > 12:returnDev.step(a)Dev.turnRight()if b < 4:move(a, b1)else:move(a2, 1) move(2, 1)2、 def move(a, b):if a < 2:returnif b 1: Spaceship.step(2)Dev.step(a)Dev.turnRight()De…

leetcode.K站中转(python)

开始准备用dfs深度搜索&#xff0c;发现n100&#xff0c;dfs可能会超时&#xff0c;即使用了剪枝。 class Solution:def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, k: int) -> int:length k 2ans float(inf)rec []vis [True]*n…

idea2023.3.2版本全局设置maven地址

idea每次新建项目都默认使用了一个user目录下的地址&#xff0c;而不是自己安装的maven地址&#xff0c;每次创建项目后&#xff0c;都要重新从settings中设置一下maven地址。 可以全局修改&#xff1a;首先在File-->Close Project回到idea最开始的界面 然后在Customize里点…

重写muduo网络库之调用流程的梳理

目录 1、流程叙述 2、我们看看TcpServer的构造都做了什么&#xff1f; 3、start() 3.1 开启loop 3.2 连接的建立 3.3 数据的收发 4、连接的关闭 muduo网络库各组件梳理见此博客 重写muduo库之组件梳理 1、流程叙述 首先&#xff0c;我们是怎么使用的&#xff1f; 1.定…

每日一学—K邻算法:在风险传导中的创新应用与实践价值

文章目录 &#x1f4cb; 前言&#x1f3af; K邻算法的实践意义&#x1f3af; 创新应用与案例分析&#x1f525; 参与方式 &#x1f4cb; 前言 在当今工业领域&#xff0c;图思维方式与图数据技术的应用日益广泛&#xff0c;成为图数据探索、挖掘与应用的坚实基础。本文旨在分享…

番外篇 | 手把手教你利用YOLOv8进行热力图可视化 | 针对视频

前言:Hello大家好,我是小哥谈。YOLOv8的热力图可视化可以帮助我们更加直观地了解模型在图像中的检测情况,同时也可以帮助我们进行模型的调试和优化。热力图是一种颜色渐变的图像,不同颜色的区域表示不同程度的关注度或者置信度。在YOLOv8中,可以通过设置阈值来控制热力图的…

关键字详解

1.用于定义访问权限修饰符的关键字 面向对象程序三大特性&#xff1a;封装、继承、多态。 1.1 访问权限符 Java 中主要通过类和访问权限来实现封装&#xff1a; 类可以将数据以及封装数据的方法结合在一起 &#xff0c;更符合人类对事物的认知&#xff0c;而访问权限用来控制…

怎样计算Excel一列数值中十位数为5的个数?

有一列数字&#xff0c;可能正数也可能是负数&#xff0c;有可能有小数&#xff0c;要怎么计算这列数字中十位数为5的数量有多少个&#xff1f; 一、按示例情况&#xff0c;数字均为整数 公式如下&#xff1a; SUM(--(MID(A1:A6,LEN(A1:A6)-1,1)"5")) 数组公式&a…

python的文件操作及函数式编程介绍

五、文件操作 1、读取键盘输入 input 获取标准输入&#xff0c;数据类型统一为字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- str input("请输入&#xff1a;") print&#xff08;"你输入的内容是: ", str&#xff09; 这会产生如下的对应着输入的…

解锁客户需求密码:银行业数据分析在业务决策中的关键作用

一、引言 在数字化和大数据时代的浪潮下&#xff0c;银行业正经历着前所未有的变革。作为数据分析领域的资深专家&#xff0c;我深知数据分析在银行业务发展中的重要性和价值。本文将从银行业数据分析的角度出发&#xff0c;深入探讨相关业务场景下的数据分析应用&#xff0c;…