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

目录

​编辑

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 worldcout << s2 << endl;		//hello worldcout << s3 << endl;		// wocout << s4 << endl;		// worldcout << s5 << endl;		// worldstring 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

	//范围forstring 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)

	//appendstring 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)

 

	//insertstring 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的位置插入一个字符xs.insert(0, 1, 'x');s.insert(s.begin(), 'x');cout << s << endl; //xxhe-hello worldC++hello// 在下标为0的位置插入三个字符xs.insert(0, 3, 'x');cout << s << endl; //xxxxxhe-hello worldC++hello

substr函数 

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

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

	//substrstring 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;}// 提取uristring 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.hqwc.cn/news/700630.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用面向对象的思想编写实时嵌入式C程序

实时嵌入式系统的软件一般由C语言编写&#xff0c;程序结构基本上都是这样的&#xff1a; // 主程序 int main(void) {init(); // 初始化while(1){tick(); // 业务逻辑}return 0; }// 计时器 static unsigned int g_timer_tick_cnt 0; // 时钟中断回调 void isr_time…

CAST: Cross-Attention in Space and Time for Video Action Recognition

标题&#xff1a;CAST: 时空交叉注意力网络用于视频动作识别 原文链接&#xff1a;2311.18825v1 (arxiv.org)https://arxiv.org/pdf/2311.18825v1 源码链接&#xff1a;GitHub - KHU-VLL/CASThttps://github.com/KHU-VLL/CAST 发表&#xff1a;NeurIPS-2023&#xff08;CCF A…

vaspkit 画 Charge-Density Difference

(echo 314;echo $(cat 1))|vaspkit 文件1提前写好使用的CHGCAR路径 SPIN_DW.vasp ../ML2scf/SPIN_DW.vasp ../ML1scf/SPIN_DW.vasp POSite and negative 默认为blue,and 青色 (RGB 30 245 245) 正值&#xff1a;blue 。负值&#xff1a;青色 RGB 30 245 245。 提示&…

自动化测试基础 --- Jmeter

前置环境安装 首先我们需要知道如何下载Jmeter 这里贴上下载网站Apache JMeter - Download Apache JMeter 我们直接解压,然后在bin目录下找到jemter.bat即可启动使用 成功打开之后就是这个界面 每次打开可以用这种方式切换成简体中文 或者直接修改properties文件修改对应的语言…

JVM 双亲委派机制详解

文章目录 1. 双亲委派机制2. 证明3. 优势与劣势 1. 双亲委派机制 类加载器用来把类加载到 Java 虚拟机中。从JDK1.2版本开始&#xff0c;类的加载过程采用双亲委派机制&#xff0c;这种机制能更好地保证 Java 平台的安全。 1.定义 如果一个类加载器在接到加载类的请求时&…

电商核心技术揭秘56:客户关系管理与忠诚度提升

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 文章目录 引言客户关系管理&#xff08;CRM&#xff09;的重要性提升顾客体验数据驱…

常见磁盘分区问题

给磁盘分区有几个主要的原因&#xff1a; 组织和管理数据&#xff1a;分区可以帮助用户更好地组织和管理数据。例如&#xff0c;你可以在一个分区上安装操作系统&#xff0c;而在另一个分区上存储个人文件。这样&#xff0c;即使操作系统崩溃或需要重新安装&#xff0c;你的个…

Milvus 简介与核心特性

一、Milvus 概述 Milvus 是一个开源的向量数据库&#xff0c;由 Zilliz 公司发起并维护。它专为处理非结构化数据而设计&#xff0c;能够存储、检索和分析大量的向量数据。Milvus 的名字来源于拉丁语&#xff0c;意为“一万”&#xff0c;象征着其处理大规模数据集的能力。 M…

Flink CDC 原理

简介 Flink CDC&#xff08;Change Data Capture&#xff09;是 Apache Flink 提供的一个变更数据捕获工具集。它可以监控数据库的变更&#xff0c;并将这些变更实时地以流的形式提供给下游系统&#xff0c;这些变更包括插入、更新和删除操作。 Flink CDC 适用于需要实时数据…

记录Spring Boot 2.3.4.RELEASE版注解方式实现AOP和通知的执行顺序

1.advice 按照以下的顺序执行 输出结果&#xff1a;(正常和异常) 说明&#xff1a;Spring boot 2.3.4.RELEASE 版本使用的AOP是spring-aop-5.2.9.RELEASE&#xff0c;AOP的通知顺序不一样。 可以测试下Spring boot 2.1.1.RELEASE 版做对比&#xff0c;发现结果是不一样的。 2…

Charger之二输入电压动态电源原理(VIN-DPM)

主要内容 Charger的VIN-DPM 前篇内容&#xff1a;电池管理IC&#xff08;Charger&#xff09;了解一下&#xff1f; 领资料&#xff1a;点下方↓名片关注回复&#xff1a;粉丝群 正文 一、 VIN-DPM概念 VIN-DPM是指输入电压动态电源管理&#xff08;Input voltage dynamic…

docker network ls(用于列出 Docker 主机上的所有网络)

docker network ls 是一个 Docker 命令&#xff0c;用于列出 Docker 主机上的所有网络。Docker 允许你创建自定义的网络&#xff0c;以便更好地控制容器之间的通信。 当你运行 docker network ls 命令时&#xff0c;你可能会看到如下类似的输出&#xff08;输出可能会根据你的…