【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.rhkb.cn/news/327535.html

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

相关文章

【C++】priority_queues(优先级队列)和反向迭代器适配器的实现

目录 一、 priority_queue1.priority_queue的介绍2.priority_queue的使用2.1、接口使用说明2.2、优先级队列的使用样例 3.priority_queue的底层实现3.1、库里面关于priority_queue的定义3.2、仿函数1.什么是仿函数&#xff1f;2.仿函数样例 3.3、实现优先级队列1. 1.0版本的实现…

memset函数

让我们先看两个代码 memset(dp, 0x3f, sizeof(dp)); for (int i 0; i < 5; i)cout << dp[i] << " "; memset(dp, 127, sizeof(dp)); for (int i 0; i < 5; i)cout << dp[i] << " "; 代码结果如下&#xff1a; 现在我们来分…

ubuntu编译pcl时报错

报错如下 cc1plus: warning: -Wabi wont warn about anything [-Wabi] cc1plus: note: -Wabi warns about differences from the most up-to-date ABI, which is also used by default cc1plus: note: use e.g. -Wabi11 to warn about changes from GCC 7 在网上找到了一封邮件…

Java | Leetcode Java题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m matrix.length, n matrix[0].length;int low 0, high m * n - 1;while (low < high) {int mid (high - low) / 2 low;int x matrix[mid / n][m…

(done) 关于 pytorch 代码里常出现的 batch_first 到底是啥?

参考文章&#xff1a;https://pytorch.org/docs/stable/generated/torch.nn.utils.rnn.pad_sequence.html 首先看参考文章里的解释&#xff0c;如下图 从文章描述来看&#xff0c;当 batch_first True 时&#xff0c;输出的张量的 size 是 B x T x *。当 batch_first False…

618速递丨各平台内卷严重,这些行业能否率先炸场?

根据最新发布的《中国网络视听发展研究报告&#xff08;2024&#xff09;》显示&#xff0c;71.2%的受访用户因为看短视频和直播进行网上购物&#xff0c;超40%的用户认为短视频和直播是他们的主要消费渠道&#xff0c;内容消费正成为各大电商争夺的关键赛道。 今年618&#x…

[BJDCTF 2020]easy_md5、[HNCTF 2022 Week1]Interesting_include、[GDOUCTF 2023]泄露的伪装

目录 [BJDCTF 2020]easy_md5 ffifdyop [SWPUCTF 2021 新生赛]crypto8 [HNCTF 2022 Week1]Interesting_include php://filter协议 [GDOUCTF 2023]泄露的伪装 [BJDCTF 2020]easy_md5 尝试输入一个1&#xff0c;发现输入的内容会通过get传递但是没有其他回显 观察一下响应…

【多模态】30、Monkey | 支持大尺寸图像输入的多任务多模态大模型

文章目录 一、背景二、方法2.1 Enhancing Input Resolution2.2 Multi-level Description Generation2.3 Multi-task Training 三、效果3.1 Image Caption3.2 General VQA3.3 Scene Text-centric VQA3.4 Document-oriented VQA3.5 消融实验3.6 可视化 论文&#xff1a;Monkey : …

【JS面试题】this

this取什么值&#xff0c;是在函数执行的时候确定的&#xff0c;不是在函数定义的时候确定的&#xff01; this的6种使用场景&#xff1a; ① 在普通函数中使用&#xff1a;返回window对象 ② 使用call apply bind 调用&#xff1a;绑定的是哪个对象就返回哪个对象 ③ 在对象…

MacApp自动化测试之Automator初体验

今天我们继续讲Automator的使用。 初体验 启动Automator程序&#xff0c;选择【工作流程】类型。从资源库区域依次将获取指定的URL、从网页中获得文本、新建文本文件三个操作拖进工作流创建区域。 然后修改内容&#xff0c;将获取指定的URL操作中的URL替换成https://www.cnb…

【C/C++笔试练习】DNS劫持、三次握手、TCP协议、HTTPS、四次挥手、HTTP报文、拥塞窗口、POP3协议、UDP协议、收件人列表、养兔子

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;DNS劫持&#xff08;2&#xff09;三次握手&#xff08;3&#xff09;TCP协议&#xff08;4&#xff09;HTTPS&#xff08;5&#xff09;四次挥手&#xff08;6&#xff09;HTTP报文&#xff08;7&#xff09;拥塞窗口&a…

JVM面试题:85道JVM虚拟机面试题及答案

面试题 1 .简述Java堆的结构&#xff1f;什么是堆中的永久代(Perm Gen space)? JVM整体结构及内存模型 试题回答参考思路&#xff1a; 1、堆结构 JVM的堆是运行时数据区&#xff0c;所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自…

【AI学习】聊两句昨夜OpenAI的GPT-4o

蹭个热点&#xff0c;聊两句昨夜的大事件——OpenAI发布GPT-4o&#xff0c;我看到和想到的一点东西。 首先是端到端方法&#xff0c;前面关于深度学习的文章&#xff0c;对端到端的重要性做了一些学习&#xff0c;对端到端这个概念有了一些理解。正如Richard Sutton在《苦涩的…

C++数据结构——红黑树

前言&#xff1a;本篇文章我们继续来分享C中的另一个复杂数据结构——红黑树。 目录 一.红黑树概念 二.红黑树性质 三.红黑树实现 1.基本框架 2.插入 3.判断平衡 四.完整代码 总结 一.红黑树概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个…

一个不知名的开源项目可以带来多少收入

起源 2020 年新冠疫情开始蔓延&#xff0c;当时我在同时经营 3 个不同的公司。除了其中的体育赛事平台因为疫情关门大吉之外&#xff0c;另外两个公司并没有受影响&#xff0c;营收和利润反而都持续增加。但是连续几个月不能出远门&#xff0c;也不能随便见朋友和客户&#xff…

Kafka学习-Java使用Kafka

文章目录 前言一、Kafka1、什么是消息队列offset 2、高性能topicpartition 3、高扩展broker 4、高可用replicas、leader、follower 5、持久化和过期策略6、消费者组7、Zookeeper8、架构图 二、安装Zookeeper三、安装Kafka四、Java中使用Kafka1、引入依赖2、生产者3、消费者4、运…

【C语言】/*操作符(下)*/

目录 一、操作符的分类 二、二进制和进制转换 2.1 进制 2.2 进制之间的转换 三、原码、反码、补码 四、单目操作符 五、逗号表达式 六、下标引用操作符[] 七、函数调用操作符() 八、结构体成员访问操作符 8.1 直接访问操作符(.) 8.2 间接访问操作符(->) 九、操作符…

【Spring】初识 Spring AOP(面向切面编程)

目录 1、介绍AOP 1.1、AOP的定义 1.2、AOP的作用 1.3、AOP的核心概念及术语 2、AOP实现示例 3、EnableAspectJAutoProxy注解 1、介绍AOP 1.1、AOP的定义 AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;直译过来就是面向切面编程&#xff0c;AOP 是一…

[动画详解]LeetCode151.翻转字符串里的单词

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解LeetCode算法系列 用通俗易懂的动画让算法题不再神秘 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成…

十二生肖Midjourney绘画大挑战:释放你的创意火花

随着AI艺术逐渐进入大众视野&#xff0c;使用Midjourney绘制十二生肖不仅能够激发我们的想象力&#xff0c;还能让我们与传统文化进行一场新式的对话。在这里&#xff0c;我们会逐一提供给你创意满满的绘画提示词&#xff0c;让你的作品别具一格。而且&#xff0c;我们还精选了…