C++详解string(全面解析)

目录

string的概念: 

string的框架:

1、成员函数

 2、迭代器(Iterators)​编辑

 3、容量

4、元素访问

5、修改

6、非成员函数重载

string的构造和拷贝构造: 

 string的析构:

string的访问:

1、operator[]

2、iterator迭代器 

3、const_iterator

 4、反向迭代器

string的扩容机制

reserve函数

resize函数

string插入:

1、push_back

2、append

3、opeator+=

 4、replace

5、insert 

 6、erase

 7、replace

查找函数:

1、find()函数

 find_first_of函数​编辑

比较函数:

字符重载:


 

基于模板的出现,C++中就出现了各种模板类,而我们仅需要调用对应的模板类即可使用,十分的方便,今天我们来学习C++中第一个模板类——string

string的概念: 

 string类是一个字符顺序表。

string的框架:

1、成员函数

 2、迭代器(Iterators)

 3、容量

4、元素访问

5、修改

6、非成员函数重载

string的构造和拷贝构造: 

1、默认构造

2、拷贝构造

3、一部分拷贝构造(从pos位置开始,拷贝len长度,如果给的len超过当前位置后面到结尾的长度或者没有给len,那么就是从当前位置直接取到结尾)

npos:实际上是‘-1’,底层存的是补码,也就是42亿九千万,换句话说’-1‘代表不可能开出这么大的连续空间,所以npos代表取到字符串的结尾

4、字符串构造

5、字符串部分构造

6、用n个相同的字符’c'构造一个字符串

7、构造一个字符串的迭代器区间

#include<iostream>
#include<string>
using namespace std;
int main() {string s0("Hello world");string s1;string s2(s0);string s3(s2, 6, 5);string s4("Hello world Hello bit");string s5("Hello world Hello bit", 7);string s6(5, 'x');string s7(s0.begin(), s0.begin() + 6);cout << "s0:" << s0 << endl;cout << "s1:" << s1 << endl;cout << "s2:" << s2 << endl;cout << "s3:" << s3 << endl;cout << "s4:" << s4 << endl;cout << "s5:" << s5 << endl;cout << "s6:" << s6 << endl;cout << "s7:" << s7 << endl;return 0;
}

 string的析构:

一般自动调用,无需注意。

string的访问:

1、operator[]

 【】重载,在函数重载的那章见过,所以这里就不过多介绍,普通版本可读可写,const版本只读

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");//可读for (size_t i = 0; i < s1.size(); i++) {cout << s1[i] << " ";//等价于下面//cout << s4.operator[](i) << " ";}cout << endl;//可修改for (size_t i = 0; i < s1.size(); i++) {s1[i]++;}for (size_t i = 0; i < s1.size(); i++) {cout << s1[i] << " ";}cout << endl;return 0;
}

2、iterator迭代器 

类似于指针的作用,但不是真的指针。

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");string::iterator it = s1.begin();while (it != s1.end()) {cout << *it << " ";it++;}cout << endl;return 0;
}

同样迭代器也可以进行修改。  

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");string::iterator it = s1.begin();while (it != s1.end()) {*it -= 3;it++;}it = s1.begin();while (it != s1.end()) {cout << *it << " ";it++;}cout << endl;return 0;
}

那既然有下标+【】为什么还要弄一个iterator这么奇怪的东西,因为下标+【】这种形式只有string用起来方便,而iterator则可以适配多种类型。

而之前学习的范围for的底层也是iterator

3、const_iterator

#include<iostream>
#include<string>
using namespace std;
int main() {//普通string(可读可写)string s1("Hello world");//const_string(只读)const string s2("Hello world");//正常修改string::iterator it = s1.begin();while (it != s1.end()) {*it -= 3;it++;}//无法修改string::const_iterator it2 = s1.begin();while (it2 != s2.end()) {*it2 -= 3;it2++;}return 0;
}

 当用普通迭代器,可以看到我们可以正常修改,但const修饰后就无法进行修改了。

 4、反向迭代器

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()) {cout << *rit << " ";++rit;	}cout << endl;return 0;
}

 包括还有const_reverse_iterator,根据规律也能看出是什么意思,不再过多赘述,所以总共有四种迭代器:普通迭代器,const迭代器,反向迭代器,const反向迭代器

string的扩容机制

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");cout << s1.size() << endl;cout << s1.length() << endl;cout << s1.capacity() << endl;cout << s1.max_size() << endl;return 0;
}

#include<iostream>
#include<string>
using namespace std;
int main() {string s;size_t sz = s.capacity();cout << "capacity change: " << sz << endl;cout << "making s grow: \n";for (int i = 0 ; i < 100; i++) {s.push_back('c');if (sz != s.capacity()) {sz = s.capacity();cout << "capacity change: " << sz << '\n';}}return 0;
}

我们看运行结果,我用的是vs2022编译器,首先会进行2倍扩容,然后后面是1.5倍扩容,但是每个编译器可能结果不相同.

reserve函数

假如我们知道需要的大小,我们还可以进行手动扩容:

手动扩容可以一次达到需要的容量,而且vs2022编译器实际上还会多扩一点,这比让编译器自己一次一次的扩容要节省时间。而且只有大于capacity的时候才会进行扩容.

resize函数

也可以进行手动扩容,并且可以进行初始化。

#include<iostream>
#include<string>
using namespace std;
int main() {string s("Hello worldxxx");cout << s.size() << endl;cout << s.capacity() << endl << endl;s.resize(10);cout << s.size() << endl;cout << s.capacity() << endl << endl;s.resize(20);cout << s.size() << endl;cout << s.capacity() << endl << endl;s.resize(30);cout << s.size() << endl;cout << s.capacity() << endl << endl;return 0;
}

 

string插入:

1、push_back

作用:可以尾插一个字符,类似于数据结构

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");s1.push_back('x');cout << s1 << endl;return 0;
}

2、append

作用:可以在string后面追加字符串,而且有多种功能,例如:追加一个字符串的一部分,多个相同的字符等等,我们举一两个代码例子看一下。

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");string s2("xxxxxx");//追加一个string类型的s2s1.append(s2);//追加一个字符串s1.append("aaaaaa");//追加多个字符s1.append(5, 'c');//追加一个字符串的一部分s1.append("yeahyeahyeah", 3, 6);//迭代器追加s1.append(s1.begin() + 2, s1.end());cout << s1 << endl;return 0;
}

3、opeator+=

作用:可以直接将string类型字符串、一般字符串、字符像赋值一样的+=在前一个string后,也是我们使用最频繁的,非常的好用。

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");string s2("xxxxxx");s1 += s2;cout << s1 << endl;s1 += ("abcdef");cout << s1 << endl;s1 += ('c');cout << s1 << endl;return 0;
}

 4、replace

作用是:用新的字符串覆盖到原本的字符上。

格式:有上面的六种,最常用的就是前两个。

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");string s2("This is a dog");//直接将s2替换给s1s1.assign(s2);cout << s1 << endl;//string& assign (const string& str, size_t subpos, size_t sublen);//从subpos位置开始,替换sublen个单位长度s1.assign(s2, 2, 5);cout << s1 << endl;return 0;
}

5、insert 

  作用:在某一个位置后面插入字符串。

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");string s2(" This is a dog");s1.insert(5, s2);cout << s1 << endl;return 0;
}

 6、erase

作用:删除字符串的一部分,如果是erase()则直接删除整个字符串。 

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");string s2(" This is a dog");s1.erase(2, 5);//删除整个字符串s2.erase();cout << s1 << endl;cout << s2 << endl;return 0;
}

 7、replace

作用:字符串的替换。 

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("Hello world");string s2(" This is a dog ");//将s2的字符串替换到s1字符串位置5,长度3的空间中s1.replace(5, 3, s2);cout << s1 << endl;cout << s2 << endl;return 0;
}

查找函数:

1、find()函数

作用:查找字符或字符串,找到返回下标,没找到返回npos

查找字符:

string s1("ababbbaa");cout << (s1.find('a')) << endl;//第二个参数为空,默认从0开始查找
cout << (s1.find('a',0)) << endl;//从0位置开始查找
cout << (s1.find('a',1)) << endl;//从1位置开始查找
cout << (s1.find('a',3)) << endl;//从3位置开始查找,前面的跳过
cout << (s1.find('c')) << endl;//未找到,返回4294967295,这是32位的-1,也是npos
cout << (s1.find('a',100)) << endl;//超出查找范围也是返回npos

查找字符串:

string s1("you are the apple of my eyes");
string s2("apple");cout << s1.find(s2) << endl;//查找s2
cout << s1.find("are", 2) << endl;//从位置2开始查找"are"
cout << s1.find("myself", 5, 2) << endl;//从位置5开始查找"myself"的前两个"my"

rfind函数和find差不多,只不过方向改变了,rfind是从后往前查找,大家可以参照find自行学习。 

 find_first_of函数

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("https://www.csdn.net/");size_t found = s1.find_first_of("aeiou");while (found != string::npos) {s1[found] = '*';found = s1.find_first_of("aeiou", found + 1);}cout << s1 << endl;return 0;
}

这里把s1里面的aeiou全部替换成*号。

find_last_of函数同find_first_of函数一样,只是查找方向不一样,也望大家自行学习。

比较函数:

字符重载:

#include<iostream>
#include<string>
using namespace std;
int main() {string s1("abdef");string s2("abcdef");//字符串比较规则,跟c一样,按照ASCII码大小,谁ASCII大谁就大cout << (s1 > s2) << endl;cout << (s1 < s2) << endl;return 0;
}

 返回值:bool类型,如果满足等式返回1,不满足返回0.

以上就是我对string的一些认识,如有问题望指正,感谢观看

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

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

相关文章

单片机,传感器等低功耗管理

**有些客户需求&#xff0c;把设备做成低功耗管理&#xff0c;这样就可以节省电池的电量&#xff0c;也可以增加传感器的使用寿命 HCLK为CPU提供时钟&#xff0c;内核执行代码。当CPU不需要继续运行时&#xff0c;可以利用多种低功耗模式&#xff0c;等待某个事件触发 ① 睡眠…

单链表的实现(C语言)

目录 1.单链表 1.1 实现单链表 1.1.1 文件创建 1.1.2 链表功能了解 1.1.3 链表的结点 1.1.4 链表的函数声明 1.1.5 链表功能的实现 链表是一种链式结构&#xff0c;物理结构不连续&#xff0c;逻辑结构是连续的&#xff0c;在计算机中链表的实际存储是按照一个结点内存放…

pod install 报错处理

由于墙的原因&#xff0c;pod install 、 pod update经常报错 有效的解决方案(推荐)&#xff1a; 以SnapKit为例 找不报错的同事要以下两个文件&#xff08;指定的版本&#xff09; 1. /Users/xxx/Library/Caches/CocoaPods/Pods/Release/SnapKit 2. /Users/xxx/Library/Cac…

95. UE5 GAS RPG 实现创建多段飞弹攻击敌人

从这篇开始&#xff0c;我们将实现一些技能&#xff0c;比如多段火球术&#xff0c;闪电链等等。 在这一篇里&#xff0c;我们先实现多段火球术&#xff0c;技能可以通过配置发射出多个火球术进行攻击。 创建多段火球函数 首先在我们之前创建的RPGFireBolt.h类里面增加一个生…

(11)(2.1.1) PWM、OneShot和OneShot125 ESC(一)

文章目录 前言 1 PWM 2 OneShot 3 参数说明 前言 大多数 ArduPilot 飞行器使用由无刷电机 ESC 控制的无刷电机。这些 ESC 使用的最常见协议是PWM、OneShot、OneShot125 和 DShot。本页介绍前三种&#xff08;PWM、OneShot 和OneShot125&#xff09;。 &#xff01;Warning…

从C语言过渡到C++

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;C &#x1f3c5;往期回顾&#x1f3c6;&#xff1a;单链表实现&#xff1a;从理论到代码-CSDN博客&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱的博客-CSDN博客 目录 ​…

数学建模笔记—— 模糊综合评价

数学建模笔记—— 模糊综合评价 模糊综合评价1. 模糊数学概述2. 经典集合和模糊集合的基本概念2.1 经典集合2.2 模糊集合和隶属函数1. 基本概念2.模糊集合的表示方法3. 模糊集合的分类4. 隶属函数的确定方法 3. 评价问题概述4. 一级模糊综合评价模型典型例题 5. 多层次模糊综合…

【鸿蒙开发工具报错】Build task failed. Open the Run window to view details.

Build task failed. Open the Run window to view details. 问题描述 在使用deveco-studio 开发工具进行HarmonyOS第一个应用构建开发时&#xff0c;通过Previewer预览页面时报错&#xff0c;报错信息为&#xff1a;Build task failed. Open the Run window to view details.…

flutter调通原生页面

最近身体真的是过于不舒服&#xff0c;等好点再来解释&#xff0c;真的是屋漏偏逢连阴雨

电脑文件怎么加密?企业常用的文件加密软件有哪些?10款推荐

随着数字化转型的加速&#xff0c;企业数据安全变得越来越重要。文件加密是保护敏感信息免遭未授权访问和数据泄露的关键措施。以下是2024年企业常用的10款文件加密软件推荐&#xff0c;旨在帮助企业构建坚固的数据安全防线。 1.安秉防泄密软件 安秉防泄密软件是一款全面的数据…

计算机网络 --- 计算机网络的分类

一、计算机网络分类 1.1 按分布范围分类 举例&#xff1a;广域网&#xff08;WAN&#xff09;、局域网&#xff08;LAN&#xff09; 举例&#xff1a;个域网&#xff08;PAN&#xff09; 1.2 按传输技术分类 广播式网络――当一台计算机发送数据分组时&#xff0c;广播范围…

CSP-J/S复赛历年考查知识点整理

CSP-J/S复赛历年考查知识点整理&#xff01;CSP-J/S复赛共4道编程题&#xff0c;每道题分值为100分&#xff0c;共400分&#xff0c;比赛试时间为J组3.5小时&#xff0c;S组4小时。 按照题目顺序&#xff0c;将4道题依次命名为T1、T2、T3、T4。 题目包括试题描述、数据范围、输…

Zabbix自定义监控项与触发器

当我们需要获取某台主机上的数据时&#xff0c;直接利用 zabbix 提供的模板可以很方便的获得需要的数据,但是有些特别的数据&#xff0c;利用这些现有的模板或监控项是无法实现的&#xff0c;例如网站状态信息的监控、mysql数据库主从状态等信息。这是就需要自己定义键值和监控…

基于SpringBoot的租房网站系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;ECLIPSE 系统展示 首页 管理员功能界面 用户信息界面 预约看房界…

JavaEE:文件内容操作(一)

文章目录 文件内容的读写---数据流字节流和字符流打开和关闭文件文件资源泄漏try with resources 文件内容的读写—数据流 文件内容的操作,读文件和写文件,都是操作系统本身提供了API,在Java中也进行了封装. Java中封装了操作文件的这些类,我们给它们起了个名字,叫做"文…

带你了解NAND NOR FLASH闪存

在正式开始介绍之前&#xff0c;给大家介绍一款非常易用稳定的Flash&#xff1a;CS创世 SD NAND。具备如下特点&#xff1a; 1&#xff0c;免驱动使用&#xff1b;2&#xff0c;可机贴&#xff1b;3&#xff0c;尺寸小巧。6*8mm&#xff0c;LGA-8封装&#xff1b; 4&#xff…

请求响应-02.请求-postman工具

一.前后端分离开发 当前主流的开发模式是前后端分离开发&#xff0c;每开发一个功能&#xff0c;就需要对该功能接口进行测试&#xff0c;当前我们的测试方法是直接将url地址输入到浏览器中&#xff0c;查看web页面是否满足我们的要求。但是浏览器发起的请求全部都是GET请求&am…

NAT技术+代理服务器+内网穿透

NAT技术 IPv4协议中&#xff0c;会存在IP地址数量不充足的问题&#xff0c;所以不同的子网中会存在相同IP地址的主机。那么就可以理解为私有网络的IP地址并不是唯一对应的&#xff0c;而公网中的IP地址都是唯一的&#xff0c;所以NAT&#xff08;Network Address Translation&…

linux/ubuntu国内镜像安装gitleaks敏感信息扫描工具教程及避坑点

1、背景 利用gitleaks扫描git仓库或者文件 GitHub上有比较详细的教程&#xff0c;但是由于每个人的安装环境不同&#xff0c;坑很多&#xff0c;网上能查到的有效信息也比较少。这里就以我坑很多的环境为例&#xff0c;捋一下步骤。 GitHub - gitleaks/gitleaks: Protect an…

集成学习(Ensembling Learning)

0. 来源 概念比较全&#xff0c;可以作为目录&#xff0c;前置知识讲得好&#xff0c;其他一般。 01.内容简介_哔哩哔哩_bilibili01.内容简介是集成学习&#xff1a;XGBoost, lightGBM的第1集视频&#xff0c;该合集共计19集&#xff0c;视频收藏或关注UP主&#xff0c;及时了…