string类详解

news/2024/5/1 15:56:18/文章来源:https://blog.csdn.net/phenix_417/article/details/127632126

文章目录

  • 1:构造string类
  • 1.1:方法
    • 1.2:测试
  • 2:size和length
    • 2.1:用途
    • 2.2:测试
  • 3:capacity
    • 3.1:用途
    • 3.2:测试
  • 4:clear
    • 4.1:用途
    • 4.2:测试
  • 5:empty
    • 5.1:用途
    • 5.2:测试
  • 6:reserve
    • 6.1:用途
    • 6.2:测试
  • 7:resize
    • 7.1:用途
    • 7.2:测试
  • 8:string的三种遍历
    • 8.1:方法一 for循环和[]重载
    • 8.2:方法二 迭代器
      • 8.2.1:const迭代器
      • 8.2.2:迭代器和[]的结论
    • 8.3范围for
  • 9:push_back
    • 9.1:功能
    • 9.2:测试
  • 10:append
    • 10.1:用法
    • 10.2:测试
  • 11:operator +=
    • 11.1:用法
    • 11.2:测试
  • 12:字符串相加例题
  • 13:reverse
    • 13.1:用法
    • 13.2:测试
  • 14:find
    • 14.1:用法
    • 14.2:测试
  • 15:rfind
    • 15.1:用法
  • 16:substr
    • 16.1:用法
  • 17:find_first_of
    • 17.1:用法
    • 17.2:测试
    • 18:erase
    • 18.1:用法
  • 19:c_str
    • 19.1:用法
    • 19.2:测试
    • 20:assign
    • 20.1:用法
    • 20.2:测试
  • 21:replace
    • 21.1:用法
    • 21.2:测试

1:构造string类

1.1:方法

  • string() :构造一个空字符串对象
  • string(const char* str) :用C-String构造对象
  • string(size_t n, char c):string类对象中包含n个c
  • string(const string& str):拷贝构造对象

1.2:测试

string test1;//构造空的string类对象
string test2("abcd");//用c-string构造string类对象
string test3(test2);//用拷贝构造函数构造

image-20221101094248937

2:size和length

2.1:用途

都是求字符串对象有效字符个数

返回值是size_t

2.2:测试

string test4("hello world");
size_t size1 = test4.size();//有效字符长度 返回值是size_t
size_t size2 = test4.length();//有效字符长度 返回值是size_t

image-20221101094506008

均为11,11位hello + 空格 + world的长度,不包含\0,而为什么会有length和size的名称差别呢,因为在数据结构中对于链表和顺序表的结构,length可以表明长度,但是在树等结构中用size可以更直观的表明大小。

3:capacity

3.1:用途

求字符串对象的容量

3.2:测试

	string str1;string str2("abc");size_t c1 = str1.capacity();size_t c2 = str2.capacity();

image-20221101095316537

4:clear

4.1:用途

清除字符串中的有效字符

4.2:测试

	string str("abcdefg");str.clear();cout << str << endl;

image-20221101095738756

什么也没有打印出来,那他的capacity有变化吗?

image-20221101095912474

容量是没有变化的,还是15,因此clear只是清空string中有效字符,不改变底层空间大小。

5:empty

5.1:用途

判断字符串是否为空,空返回true,否则返回false。

5.2:测试

	string str1("abcdefg");string str2;bool k1 = str1.empty();bool k2 = str2.empty();return 0;

image-20221101100236689

6:reserve

6.1:用途

为string对象预留空间

6.2:测试

string str("abcd");
str.reserve(20);
size_t k = str.capacity();//不预留的话是15

image-20221101100751436

容量变成了31,因此针对我们用c语言实现的数据结构中,涉及多次扩容的并且暂时知道数据容量多少的时候,先提前reserve好空间比较好。

7:resize

7.1:用途

将有效字符变成n个,查询cplusplus文档得知。

image-20221101101301572

有2种用法,用空字符填充和用指定字符填充。

既然是更改字符的数量,那么肯定有3种情况。

  • n在size和capacity中间 插入数据,闭区间
  • n<size 删除数据
  • n>capacity 扩容,补充数据

7.2:测试

	string st1("hello wjw");st1.resize(5);cout << st1.size() << endl;cout << st1.capacity() << endl;cout << st1 << endl<<endl;string st2("hello wjw");st2.resize(15);cout << st2.size() << endl;cout << st2.capacity() << endl;cout << st2 << endl<<endl;string st3("hello wjw");st3.resize(15,'*');cout << st3.size() << endl;cout << st3.capacity() << endl;cout << st3 << endl<<endl;string st4("hello wjw");st4.resize(30,'*');cout << st4.size() << endl;cout << st4.capacity() << endl;cout << st4 << endl << endl;

st2和st3的resize差别是在于填充的字符是空字符和*的区别。

image-20221101102730810

可以看到当n<size的时候,直接返回前n个字符。不修改容量

size<=n<=capacity的时候,插入数据,不修改容量

capacity<n的时候,扩容,再插入数据。

8:string的三种遍历

8.1:方法一 for循环和[]重载

	for (size_t i = 0; i < str.size(); i++){cout << str[i] << endl;}

用[]重载

8.2:方法二 迭代器

	string::iterator it = str.begin();while (it != str.end()){cout << *it << endl;}

c++中string类中存在迭代器。begin和end获取一个字符的迭代器,begin是字符串第一个字符,end是最后一个字符的下一个位置的迭代器

同时还有反向迭代器,反向遍历。

	string::reverse_iterator rit = str.rbegin();while (rit != str.rend()){cout << *rit << endl;}

在c++11中,可以直接使用auto关键词推导迭代器类型。

	auto it = str.begin();while (it != str.end()){cout << *it << endl;}

8.2.1:const迭代器

注意以下情况,如果我们要求只读一个字符串的时候,如何使用迭代器?比如

void test(const string& str)
{string::iterator it = str.begin();while(it != str.end()){cout<<*it<<endl;}
}

image-20221101110123317

编译器报错,说不能从const的迭代器转换到非const的迭代器。

查询文档得知。

image-20221101110231449

设计了2种迭代器。

当我们只读的时候,应使用string::const_iterator的格式

同样的针对第一种[]遍历,

image-20221101110348803

也有2种,const和非const。

	const string str("abcdefg");for (size_t i = 0; i < str.size(); i++){str[i] += 1;cout << str[i] << endl;}

当给定的是常量字符串对象,[]就会调用const类型的,如果试图修改字符串,就会报错。

image-20221101110554711

8.2.2:迭代器和[]的结论

针对只读的功能函数,设计的时候提供const版本即可

针对只写的功能函数,设计的时候提供非const版本即可

针对读写的功能函数,设计的时候提供const和非const版本

8.3范围for

	string str("abcd");for (auto ch : str){cout << ch;}

9:push_back

9.1:功能

尾插一个字符,会扩容

9.2:测试

	string str("abcd");size_t k = str.capacity();for(size_t i = 0; i < 100; i++){str.push_back('a');if (k != str.capacity()){k = str.capacity();cout << "capacity changed:" << str.capacity() << endl << endl;}}}

image-20221101113643080

每次大概是1.5倍的扩容,

10:append

10.1:用法

image-20221101114221684

在字符串末尾添加字符串

10.2:测试

	string str("abcd");str.append("hello");string str2("bit");str.append(str2);cout << str << endl;

可以追加一个字符串对象,也可以直接追加字符串。

image-20221101114505273

11:operator +=

11.1:用法

追加字符串

11.2:测试

string str("abcd");
str += "hello bit";
string str2("abcd");
str += str2;
cout << str << endl;

12:字符串相加例题

image-20221101115935772

class Solution {
public:string addStrings(string num1, string num2) {
int end1 = num1.size()-1;
int end2 = num2.size()-1;
string num3;
int carry = 0;
while(end1>=0||end2>=0)
{int sum1 = end1>=0?num1[end1]-'0':0;int sum2 = end2>=0?num2[end2]-'0':0;int ret = sum1 + sum2 + carry;carry = ret / 10;ret %= 10;num3 += ret+'0';--end1;--end2;
}
if(carry == 1)
{num3 += '1';
}
reverse(num3.begin(),num3.end());
return num3;
}
};

13:reverse

13.1:用法

逆置字符串

13.2:测试

	string str("hello wjw");reverse(str.begin(), str.end());cout << str << endl;

image-20221101121415411

是给2个迭代器,逆置2个迭代器范围内的数据。

14:find

14.1:用法

查找第一个符合的字符,并且返回他的下标

image-20221101122120680

image-20221101122159789

如果没有查找到,返回npos

image-20221101122224310

所以在查找的时候一般可以让查找值是否等于-1来判断是否找到

14.2:测试

	string str("hello wjw");size_t pos = str.find('j');if (pos != -1){cout << str[pos] << endl;}

string库实现的时候,给pos位置一个缺省值,因此如果我们只传对象的时候,默认是从下标0开始查找的。

那如何查找下一个字符呢?

	string str("woshi  woshi");size_t pos = str.find('w');while (pos != string::npos){cout << str[pos] << endl;pos = str.find('w', pos + 1);}

设置下一次查找的位置在第一次找到的pos之后一个位置即可。

15:rfind

15.1:用法

反向查找第一个符合的字符,并且返回其下标。

16:substr

16.1:用法

返回pos位置开始的后续的len个字符

image-20221101123711605

如图len是给了缺省值npos的,npos是size_t类型,因此如果我们不传参len的话,是相当于直接返回pos开始直到字符串结束的所有字符

因此比如我们想取一个文件的后缀名的时候,就可以使用这个

	string file("test.cpp");size_t pos = file.rfind('.');string str = file.substr(pos);cout << str << endl;

17:find_first_of

17.1:用法

image-20221101124352994

在string里面查找与给定的字符c或者字符串相符合的 string里面的第一个字符的下标。

17.2:测试

	string str("wo ai ni ge chou sha bi");size_t pos = str.find_first_of("oie");while (pos != string::npos){str[pos] = '*';pos = str.find_first_of("oie", pos + 1);}cout << str << endl;

image-20221101125030273

18:erase

18.1:用法

删除pos位置的字符

image-20221101125134275

第一个是删除pos位置开始,如果不给len的长度就会删除从pos位置一直到字符串结束的所有字符。

第二个是给一个迭代器,删除这个位置的字符

第三个是给2个迭代器,删除2个迭代器范围内的所有字符。

	string str("wo ai ni ge chou sha bi");//类似头删str.erase(0,1);cout << str << endl;string str("wo ai ni ge chou sha bi");str.erase(str.begin());cout << str << endl;string str("wo ai ni ge chou sha bi");str.erase(str.begin(), str.end());cout << str << endl;

在数据结构中顺序表我们学过,头删是要挪动数据的,因此我们尽量少用。时间复杂度为O(N^2)

19:c_str

19.1:用法

返回一个c语言中的数组,该数组为c字符串,包含\0

19.2:测试

string str("wo ai ni ge chou sha bi");
char* str1 = new char[str.size() + 1];
strcpy(str1, str.c_str());
cout << str1 << endl;

image-20221101130326691

20:assign

20.1:用法

将字符串全部替换为另外一个字符串的前n个,如果没有定义n,n默认为npos,相当于先clear再+=。

image-20221101133216624

20.2:测试

	string str("wo ai ni ge chou sha bi");cout << str.capacity()<< endl;str.assign("abcd");cout << str.capacity() << endl;

image-20221101132501685

如果是变小,容量不变

	string str("wo ai ni ge chou sha bi");cout << str.capacity()<< endl;str.assign("abcdadsadasdsadasdsadsadsadasd123213123213213213123213213213");cout << str.capacity() << endl;

image-20221101132556549

如果是变大,扩容。

assign相当于赋值拷贝

	string str("wo ai ni ge chou sha bi");

21:replace

21.1:用法

image-20221101132706914

从pos位置开始的len个字符替换成str

21.2:测试

	string str("wo ai ni ge chou sha bi");str.replace(3, 2, "buai");cout << str << endl;

如图就是把从第一个a开始的2个字符替换成buai。

image-20221101133617805

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

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

相关文章

基于CNTK/C#实现逻辑回归【附源码】

文章目录前言一、VS2022CNTK环境搭建二、逻辑回归代码构建1.逻辑回归构建2.训练数据的生成3.模型训练三、效果展示前言 本文基于CNTK实现逻辑回归二分类&#xff0c;并以之前的不同&#xff0c;本次使用C#实现&#xff0c;不适用python&#xff0c;python版的CNTK比较简单&…

Java多线程-ThreadPool线程池(三)

开完一趟车完整的过程是启动、行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速、频繁地踩刹车等动作。因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油。 而一个Java线程完整的生命周期就包括:1、T1:创建(启动) 2、T2:运行(行驶)…

苹果IOS应用上架AppStore的流程与教程

快打包生成的苹果APP上架到苹果官方appstore商店的详细流程与教程第一步:创建app发布证书以及配置文件1、打开苹果开发者中心网站:https://developer.apple.com,点击右上角 Account 使用开发者账号登录,如下图所示:​编辑切换为居中添加图片注释,不超过 140 字(可选)2、…

基于IoT全链路实时质量-魔洛哥

简介: 通过基于IoT的全链路实时质量,业务使用狄仁杰进行全链路埋点后,可一键接入魔洛哥平台,实现终端问题的实时感知和链路分析,以及智能终端系统业务场景的全链路实时质量。整体方案接入成本低(分钟级别接入),可实现全链路的实时质量分析,以及精准的终端预警能力。帮…

JavaScript 51 JavaScript 严格模式

JavaScript 文章目录JavaScript51 JavaScript 严格模式51.1 "use strict" 指令51.2 声明严格模式51.3 "use strict"; 语法51.4 为什么使用严格模式&#xff1f;51.5 严格模式中不允许的事项51.6 对未来的保障51.7 警告51 JavaScript 严格模式 “use stric…

IDEA下载与安装,保姆级教程

这里写自定义目录标题1.搜索idea2.选择官方网站3.官网进入下载页面4.版本选择问题5. Ultimate和Community对比6.下载7.安装1.搜索idea 2.选择官方网站 以前idea的官网后面有官网俩字&#xff0c;现在没有了&#xff0c;你可以看他的具体网址&#xff0c;因为idea是Jetbrains公…

猿创征文|计算机学生必须掌握的学习工具

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 目录 一.c/c使用的软件 二.GitHub和gitee的使用 三.学会如何去调试代码 修改bug 四.学习Linux上面的基本操作 五.java使用的软件 六.p…

【案例源码公开】国产AD+全志T3开发案例,为能源电力行业排忧解难!8/16通道

前 言 本文主要介绍基于全志科技T3(ARM Cortex-A7)国产处理器的8/16通道AD采集开发案例,使用核芯互联CL1606/CL1616国产AD芯片,亦适用于ADI AD7606/AD7616。CL1606/CL1616与AD7606/AD7616软硬件兼容。 备注: (1)创龙科技TL7606I模块使用AD芯片为核芯互联CL1606或ADI AD…

Softing连接解决方案——将FANUC数控机床数据集成到西门子工业边缘

2022年10月10日&#xff08;哈尔&#xff09;&#xff0c;Softing发布了edgePlug FANUC CNC&#xff0c;其丰富了edgePlug产品系列。该产品系列基于Linux的Docker容器应用并为西门子工业边缘应用提供了控制器数据。 &#xff08;Softing的edgePlug Docker容器产品为西门子工业边…

《Python+Kivy(App开发)从入门到实践》自学笔记:简单UX部件——Label标签

章节知识点总揽 4.2 Label标签 在Kivy中&#xff0c;Label小部件用于呈现文本&#xff0c;它仅支持ASCII和Unicode编码的字符串&#xff08;不支持中文&#xff09;&#xff0c;在Label中&#xff0c;可以设置文本内容、字体、大小、颜色、对齐方式、换行、引用以及标记文字等…

【PCBA方案设计】快速体温计方案

一、电子体温计方案介绍 电子体温计由温度传感器&#xff0c;液晶显示器&#xff0c;纽扣电池&#xff0c;专用集成电路及其他电子元器件组成。能快速准确地测量人体体温&#xff0c;与传统的水银玻璃体温计相比&#xff0c;具有读数方便&#xff0c;测量时间短&#xff0c;测量…

DM数据库安装、登录和创建用户

DM数据库安装、登录和创建用户子安拉取镜像 wget -O dm8_docker.tar -c https://download.dameng.com/eco/dm8/dm8_20220822_rev166351_x86_rh6_64_ctm.tar docker load -i dm8_docker.tar docker images编写docker-compose.yml version: 3 services:dm8:image: dm8_single:v8.…

操作系统(九)进程通信

文章目录1 IPC1.1通信操作1.2通信链路的实现1.3通信分类1.3.1直接通信与间接通信直接通信间接通信1.3.2消息传递的特征1.4缓冲问题1.4.1容量问题2信号&#xff08;signal&#xff09;2.1原理2.2接收信号后处理方式2.3不足2.4实现3管道3.14消息队列5共享内存6socket机制1 IPC i…

为什么选择高防DNS云解析?

DNS&#xff08;Domain Name System&#xff0c;域名服务器&#xff09;是互联网的一项核心服务&#xff0c;是域名与对应IP地址进行转换的系统&#xff0c;可将易于记忆的域名转换为可由服务器识别的用于互连通信的数字IP地址。随着大数据时代的到来&#xff0c;传统DNS所存在…

C语言~指针变量

给自己找的基础啊~~ 给自己学 多谢大佬指点 别的勿扰 指针变量的基本操作基本操作 int a,*iptr,*jptr,*kptr; iptr &a; jptr iptr; *jptr 100; kptr NULL; 己址和己空间 指针变量也是一个变量&#xff0c;对应一块内存空间&#xff0c;对应一个内存地址…

DJ8-2 主存储器的组织

如何由存储芯片到存储器&#xff1f; 确定设计容量&#xff1a;多大设计容量 芯片的选用&#xff1a;多大容量&#xff0c;位数&#xff0c;多少片&#xff0c;如何分组 地址分配&#xff1a;将CPU提供的全部地址空间的哪些地址空间分配给所设计的存储器&#xff0c;确定各芯…

docker搭建zabbix服务

docker搭建zabbix服务zabbix简介1、本次安装zabbix的镜像版本2、zabbix组件2.1 创建子网2.2 MySQL容器2.3 zabbix-server-mysql容器2.4 zabbix-web-nginx-mysql容器2.5 zabbix-agent2容器2.6 zabbix-snmptraps容器3、zabbix访问3.1 中文字体修改zabbix简介 zabbix&#xff08;…

esp32通过micropython-->MQTT--上传至腾讯云,实时显示温湿度数据保姆级教程(上)

esp32通过micropython-->MQTT--上传至腾讯云&#xff0c;实时显示温湿度数据保姆级教程&#xff08;上&#xff09;1.注册登录和创建产品&#xff1a;1.1注册账号/登录账号&#xff1a;1.2创建产品&#xff1a;1.注册登录和创建产品&#xff1a; 1.1注册账号/登录账号&…

销售人员应关注的 5 个指标

在上一篇博客 不想写代码&#xff0c;想要灵活性&#xff1f;这个指标平台全都有 中&#xff0c;我们提到了指标的分类一般分为基础指标、衍生指标和复合指标。其中基础指标可用于量化统计事务属性&#xff0c;如总金额等。而对于销售人员来说&#xff0c;最常接触/使用的指标是…

自动泊车的路径动态规划问题研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …